我看到一些代码会返回默认值,所以我想知道用户定义的类,编译器将如何定义其默认值?
答案 0 :(得分:59)
要与其他人联系,它将是null
,但我还应该添加您可以使用default
default(MyClass) // null
default(int) // 0
在使用泛型时特别有用;如果您的返回类型为default(T)
并且您不想假设它可以为空,则可能需要返回T
。
答案 1 :(得分:14)
class
的默认值为null
答案 2 :(得分:11)
注意: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
答案 3 :(得分:7)
类的默认值为null
。对于结构,默认值与实例化结构的默认无参数构造函数时所获得的相同(顺便说一下,它不能被覆盖)。相同的规则以递归方式应用于类或结构中包含的所有字段。
答案 4 :(得分:3)
如果它是引用类型,则默认值为null
,如果是值类型,则取决于它。
答案 5 :(得分:3)
我会将此“默认”类实例设为字段而非属性,例如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
}
答案 6 :(得分:2)
Assert.IsTrue(default(MyClass) == null);
答案 7 :(得分:1)
如果您希望以某种方式为引用类型定义非null默认值,请认识到引用类型具有默认值是没有意义的。在某些时候,引用需要指向构造对象的已分配内存。为了实现这一点,我想到了两个实现:
将静态实例定义为默认值:这可能有效但可能需要一种非常笨重的方式来以某种方式识别编译器在何处获取静态实例。这不是一个值得投入该语言的功能。
每次在表达式中出现默认值时都允许调用默认构造函数:这会很糟糕,因为现在您必须担心两个默认值可能不相等,因为您没有将Equals重写为不比较由于内存管理和内存分配性能的影响,以及构造函数的副作用,引用也很糟糕。
总而言之,我认为这是一种我们真正不想要的语言功能。默认(MyClass)将始终== null。
答案 8 :(得分:0)
对于引用类型或可为空值类型,默认值为 const arr = ['?','??','?','??','?','??'];
arr.sort((a, b) => b.length - a.length);
const regex = new RegExp(arr.join('|'), 'g');
const s = '?????????';
const m = s.match(regex);
console.log(m); // => ["?", "??", "?", "??", "?", "??"]
const r = s.replace(regex, 'x');
console.log(r); // => xxxxxx
:
null
对于值类型,取决于它是哪种值类型:
Person person = default; // = null
IEnumerable<Person> people = default; // = null
int? value = default; // = null