C#属性无法访问
为什么我不能有私人的struct
然后从它创建一个公共属性?C#属性无法访问
当我编译时,我得到'属性PubTest不如测试'。
例如为:
private struct test
{
int a;
double b;
}
test t = new test();
public test PubTest
{
get { return t; }
}
外部调用代码必须知道属性的返回类型。
如果struct
是私人的,它不能从外面看到。
好!那么,如果我仍然想要一个属性,我该如何保持结构的内部? – 2009-12-10 18:15:30
如果外部调用代码需要使用'struct'私有是没有道理的。你想让它变得私密的原因是什么?这可能会帮助我们找到解决方案。 – 2009-12-10 18:18:06
如果您仍然想要在包含类型中定义测试,但从包含类型的测试类型中公开测试属性,请将测试公开。不采取包装私人类型的实例,实际上没有办法解决可访问性问题。也许你应该编辑你的问题,并详细说明你想要在更高层次上完成什么? – 2009-12-10 18:19:42
因为struct
是私有的,它只能访问包含它的类型(你没有在你的例子显示,但我会打电话给T
为了简洁)。如果T
拥有公共财产,则该财产的消费者必须执行从财产返回的类型...但它不会,因为您将该类型声明为T
的私有类型。
听起来好像你认为在结构上设置“private”会改变成员的默认访问级别。那是而不是发生了什么。该结构的所有成员的默认访问级别仍然是公共的;他们可以在任何地方看到你的新结构类型可以看到。
什么改变是结构类型本身是私人的;它只对你声明它的类是可见的(并且它必须在类中而不是名称空间中,因为你不能在名称空间中声明它是私有的)。它根本无法在那里访问。这意味着即使使用该程序集中的结构,也必须小心。如果程序集中的公共或内部类型从公共或内部方法返回它,则可能会将其暴露给允许使用的地方以外的世界,这是一个编译错误。
不能暴露自身结构,如果是私人的,但可以公开它的成员:
public int TestA
{
get { return t.a; }
set { t.a = value; }
}
public double TestB
{
get { return t.b; }
set { t.b = value; }
}
这是你可以在这里做的最好。
与其他人一样,结构必须至少与房产一样可见。如果你只是想揭露结构,外部的代码的恶魔,你可以使用这样的事情:
private class Test
{
public int MyInt = 1;
public double MyDouble = 2d;
}
Test test = new Test();
public int PubTest
{
get { return test.MyInt; }
}
是的,你是对的,这是毫无意义让它私有,如果我需要访问它从外。我想要的是只读访问该类的成员之外的类。这就是为什么我试图隐藏它,只有一个getter属性
如果您需要控制对字段的访问结构体,那么你可以用如下的访问修饰符修饰方法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
将限制对结构上方法的访问。
“内部”修饰符不一定限制对OP成员的访问。 – 2009-12-10 18:42:10
我的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; }
}
}
如果它是公开的,为什么它是私人的? – Paul 2009-12-10 18:14:30