我看到一些代码会返回默认值,所以我想知道对于用户定义的类,编译器会如何定义它的默认值?
我看到一些代码会返回默认值,所以我想知道对于用户定义的类,编译器会如何定义它的默认值?
与其他人的回答一样,它将是null
,但我还应该补充一点,您可以使用default
获取任何类型的默认值。
default(MyClass) // null
default(int) // 0
在处理泛型时,这个工具非常有用;如果您的返回类型是T
,而且您不想假设它可为空,那么您可能希望返回default(T)
。
class
的默认值为null
DefaultValueAttribute
不会自动使用属性值初始化成员。您必须在代码中设置初始值。DefaultValueAttribute
来装饰您的属性。private bool myVal = false;
[DefaultValue(false)]
public bool MyProperty
{
get
{
return myVal;
}
set
{
myVal = value;
}
}
我知道这并没有回答你的问题,只是想添加相关信息。
如需更多信息,请参见http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx
我建议将这个“default”类实例作为字段而不是属性,就像 System.String.Empty
看起来的那样:
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public static readonly Person Default = new Person()
{
Name = "Some Name",
Address = "Some Address"
};
}
...
public static void Main(string[] args)
{
string address = String.Empty;
Person person = Person.Default;
//the rest of your code
}
类的默认值为null
。对于结构体,其默认值与实例化结构体的默认无参构造函数相同(不能被覆盖)。递归地应用相同规则到类或结构体内包含的所有字段中。
default
只是当 IDE 建议将 null
替换为通用的 <T>
时,它只是一个替代品。 - Govind Parmarnull
;如果它是值类型,则取决于具体情况。Assert.IsTrue(default(MyClass) == null);
对于引用类型或可空值类型,其默认值将为null
:
Person person = default; // = null
IEnumerable<Person> people = default; // = null
int? value = default; // = null
int value = default; // = 0
DateTime dateTime = default; // = 1/1/0001 12:00:00 AM
Guid id = default; // = 00000000-0000-0000-0000-000000000000
希望能够节省其他人的时间。
当今明显的选项(我仍然需要谷歌一下,因为首先遇到了这个主题)是编写一个扩展程序,帮助您初始化一个类,而不管它自己的复杂性(比如构造函数getters/setters防止简单的默认值直接赋值)。
稍微修改之前的答案:
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public static readonly Person Default = new Person()
{
Name = "Some Name",
Address = "Some Address"
};
}
=>
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
}
public static class PersonExtentions
{
public static Person withDefaults(this Person obj) {
obj.Name = "John Doe";
return obj;
}
}
然后
Person x = new Person.withDefaults();