繁体   English   中英

C#属性无法访问

[英]C# property inaccessible

为什么不能拥有私有struct ,然后从中创建公共属性?

编译时,我得到“属性PubTest比测试更难访问”。

例如:

private struct test
{
    int a;
    double b;
}

test t = new test();

public test PubTest
{
     get { return t; }
}

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

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

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

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

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

那是您在这里可以做的最好的事情。

是的,您是对的,如果我需要从外部访问它,将它私有是没有意义的。 我想要的是在其所属类之外对该结构的成员进行只读访问。这就是为什么我试图将其隐藏并且仅具有getter属性的原因

如果需要控制对结构字段的访问,则可以使用access修饰符装饰the 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将限制对结构方法的访问。

因为该struct是私有的,所以它只能由包含它的类型访问(您在示例中未显示,但为简便起见,我将其称为T )。 如果T具有公共属性,则该属性的使用者必须强制执行从该属性返回的类型的访问权限……但是它没有访问权限,因为您已将该类型声明为T私有属性。

听起来您好像认为在结构上设置“私有”会更改成员的默认访问级别。 那根本没有发生。 结构的所有成员的默认访问级别仍然是public; 在您可以看到新结构类型的任何地方都可以看到它们。

变化的是结构类型本身是私有的。 它仅对声明它的类可见(并且它必须在类而不是名称空间中,因为您不能在名称空间中将其声明为private)。 根本无法在外面访问它。 这意味着即使在该程序集中使用该结构,也必须要小心。 如果程序集中的公共或内部类型从公共或内部方法返回它,则可能会将其暴露在允许使用它的外部环境中,这是编译错误。

就像其他人提到的那样,结构至少必须与属性一样可见。 如果只想将结构的缺点暴露给外部代码,则可以使用如下代码:

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

    Test test = new Test();

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

我的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; }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM