C#面试问题81-100

85. What are anonymous types?

匿名类型是在需要的地方直接定义的类型,甚至都 不给它命名。它非常适合我们这种用例------类型小且临时,而且我们无意在其 他地方使用它

  1. 匿名类型是直接从 System.Object 派生的类对象。它们不能转换为任何 其他类型。
  2. ● 它们重写了 `Equals` 和 `GetHashCode` 方法以支持基于值的相等性。具 有相同值的两个匿名对象将具有相同的哈希码,并且 `Equals` 方法将 返回 `true`。请注意,`==` 运算符未被重载,因此它将返回 `false` (因为它们的引用不同)。
  3. ● 它们支持使用"with"关键字进行非破坏性修改。记住:非破坏性修 改不是改变原始对象,而是创建一个具有修改后值的新对象。

Can we modify the value of an anonymous type property? 否。所有匿名类 型的属性都是只读的

When should we, and should we not use anonymous types? 匿名类型的最佳使用场景是当我们想要使用的类型简单且仅限于某个 特定上下文,并且不会在其他地方使用时。它通常在复杂的 LINQ 查询 中用作临时对象。如果类型复杂或者我们想要重复使用它,就不应该使 用匿名类型。此外,匿名类型只能提供只读属性;它们不能有方法、字段、 事件等,所以如果需要这些功能,匿名类型就不适用了

Are anonymous types value or reference types? 它们是引用类型,因为它们是类,但它们通过 `Equals` 方法支持基于值的 相等性比较。换句话说,即使两个匿名对象的引用不同,只要它们的属性值 相同,`Equals` 方法也会认为它们相等

92. What is the Observer design pattern?
cs 复制代码
var bitcoinPriceReader = new BitcoinPriceReader();

var emailPriceChangeNotifier = new EmailPriceChangeNotifier(25000);
bitcoinPriceReader.AttachObserver(emailPriceChangeNotifier);

var pushPriceChangeNotifier = new PushPriceChangeNotifier(40000);
bitcoinPriceReader.AttachObserver(pushPriceChangeNotifier);

bitcoinPriceReader.ReadCurrentPrice();
bitcoinPriceReader.ReadCurrentPrice();

Console.WriteLine("Push notifications OFF");
bitcoinPriceReader.DetachObserver(pushPriceChangeNotifier);

bitcoinPriceReader.ReadCurrentPrice();

Console.ReadKey();

//首先,让我们定义 IObserver 接口,该接口将由电子邮件价格变化通知器和推送价格变化通知器实现。
public interface IObserver<TData>
{
    void Update(TData data);
}

public interface IObservable<TData>
{
    void AttachObserver(IObserver<TData> observer);
    void DetachObserver(IObserver<TData> observer);
    void NotifyObservers();
}

//可观察对象:读取价格
public class BitcoinPriceReader : IObservable<decimal>
{
    private decimal _currentBitcoinPrice;

    //。首先,我们需要定义一个观察者集合:
    private List<IObserver<decimal>> _observers = new List<IObserver<decimal>>();

    public void AttachObserver(IObserver<decimal> observer)
    {
        _observers.Add(observer);
    }

    public void DetachObserver(IObserver<decimal> observer)
    {
        _observers.Remove(observer);
    }

    //NotifyObservers 方法将简单地遍历观察者列表,并使用 _currentBitcoinPrice对其执行 Update 方法:
    public void NotifyObservers()
    {
        foreach (var observer in _observers)
        {
            observer.Update(_currentBitcoinPrice);
        }
    }

    public void ReadCurrentPrice()
    {
        _currentBitcoinPrice = new Random().Next(0, 50000);

        NotifyObservers();
    }
}

//观察者:等待接收价格变动通知的类
public class EmailPriceChangeNotifier : IObserver<decimal>
{
    private readonly decimal _notificationThreshold;

    public EmailPriceChangeNotifier(decimal notificationThreshold)
    {
        _notificationThreshold = notificationThreshold;
    }

    public void Update(decimal currentBitcoinPrice)
    {
        if (currentBitcoinPrice > _notificationThreshold)
        {
            Console.WriteLine($"Sending an email saying that " +
                $"the Bitcoin price exceeded {_notificationThreshold} " +
                $"and is now {currentBitcoinPrice}\n");
        }
    }
}

public class PushPriceChangeNotifier : IObserver<decimal>
{
    private readonly decimal _notificationThreshold;

    public PushPriceChangeNotifier(decimal notificationThreshold)
    {
        _notificationThreshold = notificationThreshold;
    }

    public void Update(decimal currentBitcoinPrice)
    {
        if (currentBitcoinPrice > _notificationThreshold)
        {
            Console.WriteLine($"Sending a push notification saying that " +
                $"the Bitcoin price exceeded {_notificationThreshold} " +
                $"and is now {currentBitcoinPrice}\n");
        }
    }
}

In the Observer design pattern, what is the Observable and what is the Observer? 可观察对象是被观察者所观察的对象。可观察对象会将自身状态的变化 通知给观察者

相关推荐
FBI HackerHarry浩几秒前
Pandas 库中用于分类变量独热编码(One-Hot Encoding)的函数 pd.get_dummies() 函数
开发语言·人工智能·python·pandas
名字还没想好☜15 分钟前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go
黄敬峰36 分钟前
Harness 工程:用 LLM 当评委,自动生成、评测、择优一条龙
面试
唐青枫41 分钟前
别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解
c#·.net
ocean21031 小时前
八股刷题之:变体树
面试·面试题·面试真题·变体树·八股精·深度拓展·高效刷题
运维行者_1 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
Patrick在香港1 小时前
Python爬虫框架实战:优雅抓取香港政府公开API数据的通用方案
java·开发语言·爬虫·python·ai编程·数据可视化·可用性测试
hey_sml1 小时前
MySQL常用操作速记:从字符集到游标全解析
java·开发语言·mysql
广东程序猿小展1 小时前
《007初露锋芒》风灵月影13项修改器下载 007初露锋芒修改器使用方法
开发语言·javascript·ecmascript
何时梦醒1 小时前
第三篇:React 组件化开发 — 函数即组件的哲学与实践
react.js·面试·typescript