假设我有以下课程:
public class Gender
{
public readonly string Name { get; set;}
public readonly char Abbreviation { get; set;}
public readonly string ChildName { get; set;}
public readonly int Number { get; set;}
public static Gender Male = new Gender { Name = "Male", Abbreviation = 'M', Number = 1, ChildName = "Boy" };
public static Gender Female = new Gender { Name = "Female", Abbreviation = 'F', Number = 2, ChildName = "Girl" };
public static Gender Unknown = new Gender { Name = "Unknown", Abbreviation = 'U', Number = 0, ChildName = "Unknown" };
}
Run Code Online (Sandbox Code Playgroud)
除了之外,我怎么能通过任何其他方式将Gender类实例化为非法
Gender MyGender = Gender.Male
从而制作
Gender Spaghetti = new Gender{Name = "Spaghetti", Abbreviation = 'S', Number = 123, ChildName = "Angel Hair" }
Run Code Online (Sandbox Code Playgroud)
在编译时抛出错误?
将private构造函数添加到Gender类:
public class Gender
{
public readonly string Name { get; set;}
public readonly char Abbreviation { get; set;}
public readonly string ChildName { get; set;}
public readonly int Number { get; set;}
private Gender()
{
}
public static Gender Male = new Gender { Name = "Male", Abbreviation = 'M', Number = 1, ChildName = "Boy" };
public static Gender Female = new Gender { Name = "Female", Abbreviation = 'F', Number = 2, ChildName = "Girl" };
public static Gender Unknown = new Gender { Name = "Unknown", Abbreviation = 'U', Number = 0, ChildName = "Unknown" };
}
Run Code Online (Sandbox Code Playgroud)
您也可以添加readonly到Male/ Female/ Unknown声明,以使以下代码不可能:
Gender.Male = Gender.Female;
Run Code Online (Sandbox Code Playgroud)
给它一个私有构造函数:
public class Gender
{
// ...
private Gender() { }
}
Run Code Online (Sandbox Code Playgroud)
通常,如果没有定义构造函数,则编译器会创建一个没有参数的"默认构造函数".但如果你定义一个,那就没有默认值.如果那个是私人的,那个班级之外的任何东西都不能称之为.所以没有什么可以构建Gender除Gender自身之外的实例.