我有一个基本的疑问,我想在C#编程时可能会非常常见。
基本上这里描述了我当前代码的结构:
文件: api.cs
namespace API
{
class OutputClass{
private int var1;
private int var2;
int getVar1()
{
return var1;
}
int getVar2()
{
return var2;
}
}
class APICore {
public event Action<OutputClass> FrameDecodeComplete;
void someFunction() {
OutputClass myOutput;
myOutput.var1 = 1;
myOutput.var2 = 2;
FrameDecodeComplete(myOutput);
}
}
}
我的要求是此API的用户创建一个APICore类型的对象,并以OutputClass对象的形式接收输出。
显然,myOutput.var1 = 1;
和myOutput.var2 = 2;
行会因为它的保护级别而引发错误。
但我还需要确保API的用户无法为var1,var2设置值。所以我不想将var1和var2的访问级别更改为public。我也不想定义诸如setVar1(),setVar2()之类的函数。
请发表评论。
答案 0 :(得分:3)
如果您不希望外部程序集能够访问您的变量,那么您可以使用internal关键字。
class OutputClass
{
public int Var1 { get; internal set; }
}
该语法是属性,这是一种可用于为您的字段制作getter和setter的语法。
我向您展示的语法是以下
的简写class OutputClass
{
private int _var1;
public int Var1
{
get
{
return _var1;
}
internal set
{
_var1 = value;
}
}
}
答案 1 :(得分:1)
检查internal关键字,看起来它解决了您的问题
但你也可以使用2个参数向你的OutputClass添加内部构造函数方法,因此someFunction将调用构造函数并返回对象,在构造函数中你将能够初始化私有变量
答案 2 :(得分:1)
听起来他们的保护级别应为internal
。这样,var1
和var2
只会在声明它们的程序集中可见。
http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.90%29.aspx
答案 3 :(得分:1)
如果您希望用户可以访问get
属性,但不能访问set
属性,那么您可以创建这样的访问者属性。
public int var1 { get; private set; }
通过这种方式,您可以在类中自行修改变量,并且类的使用者可以访问该值,但不能更改它。
答案 4 :(得分:0)
给OutputClass
一个受保护的构造函数,该构造函数接受设置var1
和var2
的参数,然后给APICore
一个派生自OutputClass
并传递参数的私有嵌套类到受保护的基础构造函数。
类似的东西:
class OutputClass{
private int var1;
private int var2;
int getVar1()
{
return var1;
}
int getVar2()
{
return var2;
}
protected OutputClass(int _var1, int _var2)
{
var1 = _var1;
var2 = _var2;
}
}
class APICore {
public event Action<OutputClass> FrameDecodeComplete;
void someFunction() {
SubOutputClass myOutput = new SubOutputClass(1,2);
FrameDecodeComplete(myOutput);
}
private SubOutputClass : OutputClass
{
public SubOutputClass(int var1, int var2) : base(var1, var2)
{
}
}
}
使用internal
相同程序集中的任何类都可以访问它。这对你来说可能是一个问题,也可能不是。