如何使用 { get; set; } 访问私有变量



我想为我的网站创建一个有很多私有变量的类。

我认为有一个解决方案不是为每个变量编写所有的getter和setter,类似于

private int confirmed { get; set; }

这是正确的方式吗?那么,如何从类外部访问此值?

我试过.confirmed,我收到错误说它是私有的(我明白)

但更令人惊讶的是,.getConfirmed()getconfirmed()也不起作用。

我认为{ get; set; }会隐式地创建这些方法。

有人可以为我澄清这个问题吗?

您可以将您的属性声明为公共属性,然后将 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
}
}

你需要明白,

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使访问器和突变器也是私有的,这就是为什么您无法在类外部访问它们的原因。此外,这些方法在编译时无法访问,因此不允许调用instance.confirmed_get(),只instance.confimed读取和写入属性。

您可能想要的是将其声明为public

public int confirmed { get; set; }

其中行为相似(字段仍private),但现在两种方法都public。正如其他人所提到的,您可以单独修改getsetreadonlywriteonly类型的行为,

public int confirmed { get; private/protected set; }

public int confirmed { private/protected get; set; }

最后一件事,你应该养成使用骆驼盒的习惯,例如 田地的Confirmed和下骆驼壳,例如confirmed(有些人甚至可能会做_confirmed)。区分这两种类型是一种流行的命名约定,特别是对于类的消费者。

如何

从类外部访问此值?

你不能(没有反射形式受信任的代码)。 它们是私人的。 如果您希望getter是公开的,但二传手是私有的,那么请

public int confirmed { get; private set; }

我以为{得到;设置;}将隐式创建这些方法。

确实如此,但它们在设计时无法访问。

如果你想从类外获取它,就这样做。

public int confirmed { get; set; }

或者你可以走这条路:

private int confirmed;
public int Confirmed 
{
get { return confirmed }
set { confirmed = value; }
}

有多种方法可以执行此类操作。 根据您的要求,您可以从以下方法中选择任何一种方法:

// 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;
}
}

最新更新