C#动态可接受使用

时间:2018-03-31 18:05:53

标签: c#

所以我可以选择'对象'或'动态'。

动态是否可以使用?

我保持代码简短,所以请忽略任何运行时异常,例如null propertyName和null newValue或找不到字典的索引。

我所知道的:

  1. oldValue和newValue将是彼此相同的类型。
  2. propertyName将始终提供相同的Type。 (总是比较相同的类型)
  3. 将根据类型执行其他检查和操作。
  4. oldValue和newValue可以是Value或Reference类型。
  5. 通话:

    public int Index
    {
        get { return _Index; }
        set
        {
            if (_Index == value) return;
    
            int oldValue = _Index;
    
            _Index = value;
    
            OnChanged(oldValue, value);
        }
    }
    private int _Index;
    
    public string Name
    {
        get { return _Name; }
        set
        {
            if (_Name == value) return;
    
            string oldValue = _Name;
            _Name = value;
    
            OnChanged(oldValue, value);
        }
    }
    private string _Name;
    

    示例1:

    private Dictionary<string, dynamic> ModifiedValues = new Dictionary<string, dynamic>();
    
    protected internal virtual void OnChanged(dynamic oldValue, dynamic newValue, string propertyName)
    {
        if (ModifiedValues[propertyName] == newValue)
            ModifiedValues.Remove(propertyName);
        else
            ModifiedValues[propertyName] = newValue;
    
        //...
    }
    

    示例2:

    private Dictionary<string, object> ModifiedValues = new Dictionary<string, object>();
    
    protected internal virtual void OnChanged(object oldValue, object newValue, [CallerMemberName] string propertyName = null)
    {
        if (newValue.GetType().IsValueType)
        {
            if (newValue.Equals(ModifiedValues[propertyName]))
                ModifiedValues.Remove(propertyName);
            else
                ModifiedValues[propertyName] = newValue;
    
        }
        else
        {
            if (newValue == ModifiedValues[propertyName])
                ModifiedValues.Remove(propertyName);
            else
                ModifiedValues[propertyName] = newValue;
        }
    
        //...
    }
    

1 个答案:

答案 0 :(得分:0)

C#中的对象类表示System.Object类型,它是C#类层次结构中的根类型。通常我们在编译时指定对象类型时会使用此类,这通常会在我们处理互操作性时发生。

动态类型是在C#4.0中引入的。动态类型间接使用System.Object,但它不需要在运行时对任何操作进行显式类型转换,因为它仅在运行时标识类型。

根据上述定义,动态是可以接受的。