我已经在许多地方读过,公开公开字段并不是一个好主意,因为如果你以后想要更改属性,则必须重新编译使用你的类的所有代码.
但是,在不可变类的情况下,我不明白为什么你需要更改为属性 - 毕竟你不会在'set'中添加逻辑.
对此有任何想法,我错过了什么吗?
差异的例子,对于那些比文本更容易阅读代码的人:)
//Immutable Tuple using public readonly fields
public class Tuple<T1,T2>
{
public readonly T1 Item1;
public readonly T2 Item2;
public Tuple(T1 item1, T2 item2)
{
Item1 = item1;
Item2 = item2;
}
}
//Immutable Tuple using public properties and private readonly fields
public class Tuple<T1,T2>
{
private readonly T1 _Item1;
private readonly T2 _Item2;
public Tuple(T1 item1, T2 item2)
{
_Item1 = item1;
_Item2 = item2;
}
public T1 Item1 { get { return _Item1; …Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的课程:
public class SampleClass
{
const string UnChangableUserName { get; private set; }
string Password { get; private set; }
public SampleClass(string UnChangableUserName, string Password)
{
this.Password = Password;
this.UnChangableUserName = UnChangableUserName;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望构造函数为const分配一个值,而不是在定义const时要设置的值。我该怎么做?
我知道我不能简单地使用set,但是使用const可以更有效地利用资源,并且更加优雅,其他开发人员也更容易理解,我不希望有set,因此他们不会添加它。
我想在我的班级中声明一个变量,以后不能像这样更改:
obj myobj=new obj()
myobj.CONSTANT_VAR="Changed value" //ERROR!!
Run Code Online (Sandbox Code Playgroud)
...但其值可以像这样访问:
Console.WriteLine(myobj.CONSTANT_VAR)
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
public class obj{
public int a, b;
public const string CONSTANT_VAR;
public obj(int x,int y){
a=x;
b=y;
CONSTANT_VAR=1/(a*((""+a).Length)+3/(b*((""+b).Length)).ToString();
}
public int do(){
return this.a+this.b-(CONSTANT_VAR).Length;
}
}
class DriverClass(){
static void Main(){
obj myObj=new obj(2,3);
myObj.a=34;
myObj.b=35;
myObj.CONSTANT_VAR="changed ur string lol"; //i want it to print error
Console.WriteLine(CONSTANT_VAR); //no error
Console.WriteLine(myObj.add());
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误消息:
constants must have a value assigned
Run Code Online (Sandbox Code Playgroud)
但我不想事先给它赋值..... 我该怎么办?