[英]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 get
或set
方法,如下所示。
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.