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? 可观察对象是被观察者所观察的对象。可观察对象会将自身状态的变化 通知给观察者

相关推荐
tachibana21 分钟前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
天桥下的卖艺者6 分钟前
R语言使用ggcube包轻松绘制文章中的各类3D图形
开发语言·3d·r语言
十年Java程序媛1 小时前
Java 多线程基础与锁机制|进程线程、synchronized、volatile、Lock 面试全梳理
java·spring boot·面试
唐钰小宝B1 小时前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
ShineWinsu1 小时前
对于CSS:弹性布局(Flexbox)的解析
前端·css·面试·浏览器·web·网页·弹性布局
下页、再停留2 小时前
【C#桌面客户端系列学习-11】将SQLite数据库打包到exe里
数据库·c#·visual studio
下页、再停留2 小时前
【C#桌面客户端系列学习-12】封装SQLite数据库基础操作工具类(CURD)
数据库·c#·visual studio
知识分享小能手2 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>2 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
张张123y2 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi