我想为我的网站创建一个包含大量私有变量的类。
我认为有一个解决方案是不为每个变量编写所有的getter和setter,比如
private int confirmed { get; set; }
这是正确的方法吗?那么,如何从课外访问这个值?
我试过.confirmed
,我收到的错误是说它是私密的(我明白了)
但更令人惊讶的是,.getConfirmed()
或getconfirmed()
也不起作用。
我认为{ get; set; }
会产生隐含的那些方法。
有人可以为我澄清这个问题吗?
答案 0 :(得分:17)
您可以将您的财产声明为公开,然后将getter或setter分别标记为私有:
public int confirmed { get; private set; }
这样,您可以在定义的类之外访问confirmed
:
Console.WriteLine(myClass.confirmed); // This is OK
myClass.confirmed = "Nothing"; // Can't do this
唯一可以设置confirmed
值的人就是MyClass:
public class MyClass {
public int confirmed { get; private set; }
public MyClass() {
this.confirmed = "This"; // This is fine as we have private access
}
}
答案 1 :(得分:4)
您需要了解这一点,
private int confirmed { get; set; }
将扩展为一组private
方法,其中包含private
个支持字段,
private int _confirmed;
private int confirmed_get()
{
return this._confirmed;
}
private void confirmed_set(int value)
{
this._confirmed = value;
}
因此,标记属性private
使得访问者和mutator都是私有的,这就是为什么你不能在类之外访问它们的原因。此外,这些方法在编译时无法访问,因此不允许调用instance.confirmed_get()
,只有instance.confimed
来读取和写入属性。
您可能希望将其声明为public
,
public int confirmed { get; set; }
行为相似(字段仍为private
),但这两种方法现在都是public
。正如其他人提到的那样,您可以针对get
或set
类型的行为单独修改readonly
和writeonly
,
public int confirmed { get; private/protected set; }
或
public int confirmed { private/protected get; set; }
最后一件事,你应该养成使用骆驼案例的习惯,例如: Confirmed
和较低的驼峰字段,例如字段confirmed
(有些人甚至可以_confirmed
)。它是一种流行的命名约定,用于区分这两种类型,特别是对于该类的消费者。
答案 2 :(得分:3)
如何从课外访问此值?
您无法(没有反映形成可信代码)。他们私人。如果您希望 getter 是公开的,但 setter 是私有的,那么
public int confirmed { get; private set; }
我认为{get; set;}会隐式创建这些方法。
确实如此,但它们在设计时无法访问。
答案 3 :(得分:2)
如果你想从课外获得它,就这样做。
public int confirmed { get; set; }
或者你可以走这条路:
private int confirmed;
public int Confirmed
{
get { return confirmed }
set { confirmed = value; }
}
答案 4 :(得分:1)
有多种方法可以执行此类操作。根据您的要求,您可以从下面选择任何一种方法:
// Old Conventional - Statement body
public class SampleClass1
{
public bool CanAccessFromOutside
{
get { return _cannotAccessFromOutside; }
}
private bool _cannotAccessFromOutside;
private void DoSomething()
{
_cannotAccessFromOutside = true;
}
}
// Expression Bodied Property
public class SampleClass2
{
public bool CanAccessFromOutside => _cannotAccessFromOutside;
private bool _cannotAccessFromOutside;
private void DoSomething()
{
_cannotAccessFromOutside = true;
}
}
// Auto Property
public class SampleClass3
{
public bool CanAccessFromOutside { get; private set; }
private void DoSomething()
{
CanAccessedFromOutside = true;
}
}