0

我有一个基本的疑问,我猜想在 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()之类的函数。

请评论。

4

5 回答 5

3

如果您不希望外部程序集能够访问您的变量,则可以使用 internal 关键字。

class OutputClass
{
    public int Var1 { get; internal set; }
}


该语法是一个property,它是一种可用于为您的字段创建 getter 和 setter 的语法。

我向您展示的语法是以下内容的简写

class OutputClass
{    
    private int _var1;
    public int Var1 
    {
        get
        {
            return _var1;
        }
        internal set
        {
            _var1 = value;
        }
    }
}
于 2013-10-17T20:08:14.380 回答
1

检查内部关键字,看起来它解决了你的问题

但是您也可以使用 2 个参数向您的 OutputClass 添加内部构造函数方法,因此 someFunction 将调用构造函数并返回对象,在您的构造函数中您将能够初始化私有变量

于 2013-10-17T20:07:12.180 回答
1

听起来他们的保护级别应该是internal。这样,var1并且var2仅在声明它们的程序集中可见。

http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.90%29.aspx

于 2013-10-17T20:07:21.187 回答
1

如果您希望用户可以访问get属性,但不能访问set它们,那么您可以像这样创建访问器属性。

public int var1 { get; private set; }

这样,您可以在类中自己修改变量,并且类的使用者可以访问该值,但不能更改它。

于 2013-10-17T20:08:03.187 回答
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集中的任何类都可以访问它。这对您来说可能是也可能不是问题。

于 2013-10-17T20:10:41.997 回答