C# 在字段上强制使用成员
有没有办法强制使用属性而不是私有支持字段 例如:C# 在字段上强制使用成员,c#,C#,有没有办法强制使用属性而不是私有支持字段 例如: //field private string str; // property public string Str { get { return this.str; } set { this.str = value; DoSomething(); } } 两个成员都需要具有读取权限,但只有属性才应该具有写入权限。如何做到这一点 编辑:我说的是类内的访问权限。不是从外部。我假设您不想在类中直接写入str的原因是DoSomething与
//field
private string str;
// property
public string Str
{
get { return this.str; }
set { this.str = value; DoSomething(); }
}
两个成员都需要具有读取权限,但只有属性才应该具有写入权限。如何做到这一点
编辑:我说的是类内的访问权限。不是从外部。我假设您不想在类中直接写入
str
的原因是DoSomething
与其值的变化紧密耦合。因此,要解决这个问题,请使用关注点分离原则:创建一个内部类,并让它全权负责确保保持耦合:
private string _str;
public string Str
{
get { return _str; }
private set { _str = value; DoSomething();
}
internal class StrDoSomethingCoupler
{
private readonly Action _doSomething;
private string str;
public StrDoSomethingCoupler(Action doSomething)
{
_doSomething = doSomething;
}
public string Str
{
get { return _str; }
set { _str = value; _doSomething(); }
}
}
public class SomeClass
{
private readonly StrDoSomethingCoupler _coupler =
new StrDoSomethingCoupler(DoSomething);
...
public string Str
{
get { return _couple.Str; }
set { _coupler.Str = value; }
}
}
我假设您不想在类中直接写入
str
的原因是DoSomething
与其值的变化紧密耦合。因此,要解决这个问题,请使用关注点分离原则:创建一个内部类,并让它全权负责确保保持耦合:
internal class StrDoSomethingCoupler
{
private readonly Action _doSomething;
private string str;
public StrDoSomethingCoupler(Action doSomething)
{
_doSomething = doSomething;
}
public string Str
{
get { return _str; }
set { _str = value; _doSomething(); }
}
}
public class SomeClass
{
private readonly StrDoSomethingCoupler _coupler =
new StrDoSomethingCoupler(DoSomething);
...
public string Str
{
get { return _couple.Str; }
set { _coupler.Str = value; }
}
}
虽然不清楚,但这是一个好问题。让我重新措辞
Class A
{
//field
private string _str;
// member
public string Str
{
get { return _str; }
set { _str = value; DoSomething(); }
}
public void SomeMethod()
{
_str = "Dont access like this";
Str= "Should access only like this";
}
}
遗憾的是,答案是否定的,你不能限制类A中的_str的访问。它只是一种你应该遵循的编码实践,没有支持它的内置语言特性。参考-
我可以在示例代码中看到一个问题。你在Str的setter中做了两件事
i、 e.设置{{u str=value;DoSomething();}
是一种不好的做法(尽管有些地方不可避免,如wpf中的NotifyPropertyChanged()
)
所以不要这样做,最好通过将DoSomething()与Str.set分离来改变这种逻辑。差不多
Class A
{
//field
private string _str;
// member
public string Str
{
get { return _str; }
private set { _str = value; }
}
private void DoSomething()
{
..
..
}
public void UpdateStrAndDoSomething(string strValue)
{
Str = strValue;
DoSomething();
}
}
虽然不清楚,但这是一个好问题。让我重新措辞
Class A
{
//field
private string _str;
// member
public string Str
{
get { return _str; }
set { _str = value; DoSomething(); }
}
public void SomeMethod()
{
_str = "Dont access like this";
Str= "Should access only like this";
}
}
遗憾的是,答案是否定的,你不能限制类A中的_str的访问。它只是一种你应该遵循的编码实践,没有支持它的内置语言特性。参考-
我可以在示例代码中看到一个问题。你在Str的setter中做了两件事
i、 e.设置{{u str=value;DoSomething();}
是一种不好的做法(尽管有些地方不可避免,如wpf中的NotifyPropertyChanged()
)
所以不要这样做,最好通过将DoSomething()与Str.set分离来改变这种逻辑。差不多
Class A
{
//field
private string _str;
// member
public string Str
{
get { return _str; }
private set { _str = value; }
}
private void DoSomething()
{
..
..
}
public void UpdateStrAndDoSomething(string strValue)
{
Str = strValue;
DoSomething();
}
}
您可以将支持字段设置为私有,这样,除了实例本身之外,其他任何东西都无法访问它。@phuzi:您应该……我对这里“member”的用法有点困惑。您希望哪一个是可写的?在类中,我不希望使用this.str,而是希望使用.str。@devhedgehog,然后不要使用它。它是类的内部,因此由您来确保它的正确使用。您可以将支持字段设置为私有,以便除了实例本身之外,其他任何东西都无法访问它。@phuzi:您应该……我对“成员”的用法有点困惑。您希望哪一个是可写的?在类中,我不希望使用this.str,而是希望使用.str。@devhedgehog,然后不要使用它。它是类内部的,所以由您来确保它的正确使用。为什么要投否决票?如果你能指出错误,这会很有帮助。二传手的副作用真的违反了CQR吗?调用getter肯定会产生任何副作用,但设置也会产生副作用。@DavidArno很抱歉,我在假设设置中也违反了CQR,因此引用了它。但是OP的问题是因为在二传者中有太多的责任。那么,我说它违反SRP是对的吗?我同意这很可能是一个类中的代码太多和一个或多个关注点分离的问题,这两个问题都导致他希望阻止
str
被直接修改,并且需要将DoSomething
与之结合起来进行更改。为什么要投反对票?如果你能指出错误,这会很有帮助。二传手的副作用真的违反了CQR吗?调用getter肯定会产生任何副作用,但设置也会产生副作用。@DavidArno很抱歉,我在假设设置中也违反了CQR,因此引用了它。但是OP的问题是因为在二传者中有太多的责任。那么,我说它违反SRP是对的吗?我同意这很可能是一个类中的代码太多和一个或多个关注点分离问题的情况,这两个问题都导致他希望阻止str
被直接修改,并且需要将DoSomething
与它的更改结合起来。