代码之家  ›  专栏  ›  技术社区  ›  Brandon Grossutti

你能在T是你自己的类的地方创建你自己的默认T吗?

  •  2
  • Brandon Grossutti  · 技术社区  · 16 年前

    假设我有以下内容

    public class A 
    {
       private string _someField;
       public string SomeField { get { return _someField; } }
    }
    

    出于某种原因,我正在检查这个类的默认值,我想为一个类设置默认值,就像int类型的默认值是0一样,我希望在上面的类中,somefield的默认值是“hello”;

    int i = default(int); // i is 0
    A myClass = default(A);
    string s = myClass.SomeField; // s is hello
    

    这更多是为了我自己的理论满足,而不是实际应用。只是想知道。

    6 回复  |  直到 16 年前
        1
  •  3
  •   Stefan Moser    16 年前

    没有方法重载默认值(t)。

    在我看来,这真的像是在请求不可为空的引用类型,而这些引用类型在.NET中还不存在。请在此处查看实现: http://msmvps.com/blogs/jon_skeet/archive/2008/10/06/non-nullable-reference-types.aspx

        2
  •  5
  •   Sean Bright Sean Stinehour    16 年前

    否。类(引用类型)的默认值为 null 不能超载。

        3
  •  5
  •   Jonathan Rupp    16 年前

    不能更改t的默认值(t)。对于引用类型,它始终为空,对于值类型,它始终为“空”值(即对于结构,所有成员都处于其默认值(未斜体化的值)。

        4
  •  0
  •   bashmohandes    16 年前

    对于类(引用类型),默认关键字对类成员不做任何操作,它只将整个引用设置为空。

        5
  •  0
  •   Paul    16 年前

    虽然default()将始终返回空值,但可以使用where指定类必须包含无参数构造函数,以便对其调用new。

    void SomeMethod<T>(T something) where T : new()
        {
            T newObject = new T();
        }
    
        6
  •  -1
  •   Simon P Stevens    16 年前

    这应该可以做到:

    public class A 
    {
       private string _someField = "hello";
       public string SomeField { get { return _someField; } }
    }
    

    现在,当您创建该类的实例时,somefield的初始值将是hello。

    [编辑: 这不符合你的要求。像其他人在注释中指出的那样,其中t是类的缺省值(t)将始终导致空值。

    相反,您将正常创建类,而不是使用“default”关键字。

    A myClass = new A();
    string defaultValue = myClass.SomeField // This will be set to "hello" by default.
    

    ]