一、背景
1、我有这样一个需求,对对象类的某个属性设置一个默认值,在创建对象的时候不对这个属性设置具体的值,自动默认使用用DefaultValue配置的默认值
2、实际:并没有按照预想的隐性的帮我给设置了DefaultValue的属性加上DefaultValue值。
二、原因分析
1、DefaultValue
特性实际作用
-
DefaultValue
特性在代码生成或者设计器中提供默认值的功能,主要是针对一些第三方工具或者 IDE。例如,当你使用 Visual Studio 时,如果你在设计表格时使用了DefaultValue
特性,那么在设计表格时,该属性的默认值就会在设计器中显示出来,让你可以更方便地设置属性的默认值。 - 这种特性的存在有一定的意义,它可以在代码生成或者设计器中提供默认值,让开发人员在创建对象时可以快速选择默认值,提高开发效率。此外,它还可以作为一种约定,规范开发人员的代码风格,使代码更加易于维护和阅读。
2、注意
- 这种特性只是提供了一个默认值,而不是在运行时自动设置属性的值,也就是说,它只是在创建对象时,提供了一个默认值,但是并不会自动设置该属性的值。
https://learn.microsoft.com/zh-cn/dotnet/api/system.componentmodel.defaultvalueattribute?view=net-8.0&redirectedfrom=MSDN
三、解决办法
1、在类的构造函数中显式地设置每个属性的默认值
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person()
{
Name = "John";
Age = 30;
}
public void ChangeDefaultValues()
{
Name = "Jane";
Age = 35;
}
}
// 在主函数中创建对象并输出属性值
static void Main(string[] args)
{
Person p1 = new Person();
Console.WriteLine($"Name: {p1.Name}, Age: {p1.Age}"); // 输出:Name: John, Age: 30
p1.ChangeDefaultValues();
Console.WriteLine($"Name: {p1.Name}, Age: {p1.Age}"); // 输出:Name: Jane, Age: 35
}
2、在属性的 set 访问器中设置默认值。
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = string.IsNullOrEmpty(value) ? "Unknown" : value; }
}
}
在这个示例中,我们在 Name
属性的 set
访问器中设置了默认值。当我们创建一个 Person
对象并设置 Name
属性时,如果我们没有为 Name
属性显式设置值,它将自动设置为 "Unknown"。例如:
Person person1 = new Person();
Console.WriteLine(person1.Name); // 输出 "Unknown"
Person person2 = new Person { Name = "John" };
Console.WriteLine(person2.Name); // 输出 "John"
3、属性初始化器,它可以在定义属性时直接给属性设置一个默认值,而不需要使用特性。这种方式是 C# 6.0 引入的新特性,可以让代码更加简洁易读。但是需要注意的是,属性初始化器只在对象创建时才会执行,如果对象已经被创建,再去修改属性的默认值是不会生效的。
public class MyClass
{
public string MyField { get; set; } = "Default value";
}
public class Program
{
static void Main(string[] args)
{
MyClass obj = new MyClass();
Console.WriteLine(obj.MyField); // Output: Default value
obj.MyField = "New value";
Console.WriteLine(obj.MyField); // Output: New value
MyClass obj2 = new MyClass();
Console.WriteLine(obj2.MyField); // Output: Default value
}
}