C#属性无法访问

时间:2009-12-10 18:11:56

标签: c#

为什么我没有私有struct然后从中创建公共属性?

编译时,我得到'属性PubTest比test'更不易访问。

E.g:

private struct test
{
    int a;
    double b;
}

test t = new test();

public test PubTest
{
     get { return t; }
}

7 个答案:

答案 0 :(得分:12)

外部调用代码必须知道属性的返回类型。

如果将struct设为私有,则无法从外部看到它。

答案 1 :(得分:2)

如果它是私有的,你不能公开结构本身,但你可以公开它的成员:

public int TestA
{
    get { return t.a; }
    set { t.a = value; }
}

public double TestB
{
    get { return t.b; }
    set { t.b = value; }
}

这是你能在这里做的最好的事情。

答案 2 :(得分:2)

  

是的,你是对的,如果我需要从外面访问它,那么将它私有化是毫无意义的。我想要的是只读访问该类之外的这个结构的成员。这就是为什么我试图隐藏它并且只有一个getter属性

如果您需要控制对结构字段的访问,那么您可以使用访问修饰符修饰getset方法,如下所示。

public struct Test
{
    private int a;
    private double b;

    public int A
    {
        get { return a; }
        internal set { a = value; }
    }

    public double B
    {
        get { return b; }
        internal set { b = value; }
    }
}

internal修饰符限制对已定义包含类型的程序集中的代码的访问。使用private将限制对结构上方法的访问。

答案 3 :(得分:0)

由于struct是私有的,因此只能包含它的类型(您在示例中未显示,但为简洁起见,我将其称为T)。如果T具有公共属性,则该属性的使用者必须具有对从属性返回的类型的访问权限......但它不会,因为您将该类型声明为{{ 1}}。

答案 4 :(得分:0)

听起来您认为在struct上设置“private”会更改成员的默认访问级别。那是会发生什么。结构的所有成员的默认访问级别仍然是公共的;在任何可以看到新结构类型的地方都可以看到它们。

更改结构类型本身是私有的;它只对你声明它的类可见(并且它必须在类而不是命名空间中,因为你不能在命名空间中将它声明为私有)。它根本无法在那里访问。这意味着即使在该程序集中使用struct也必须要小心。如果程序集中的公共或内部类型从公共或内部方法返回它,您可能会将它暴露给允许使用它之外的世界,这是编译错误。

答案 5 :(得分:0)

与其他人提到的一样,结构需要至少与财产一样可见。如果您只想将结构的恶意暴露给外部代码,您可以使用以下内容:

    private class Test
    {
        public int MyInt = 1;
        public double MyDouble = 2d;
    }

    Test test = new Test();

    public int PubTest
    {
        get { return test.MyInt; }
    }

答案 6 :(得分:0)

我的2美分:

使用接口?

public interface ITest
{
    int a { get; }
    double b { get; }
}
public class MyClass
{
    private struct test : ITest
    {
        private int _a;
        private double _b;

        public int a 
        { 
            get { return _a; }
        }

        public double b 
        { 
            get { return _b; }
        }
    }
    public ITest PubTest
    {
        get { return new test() as ITest; }
    }
}