为什么我没有私有struct
然后从中创建公共属性?
编译时,我得到'属性PubTest比test'更不易访问。
E.g:
private struct test
{
int a;
double b;
}
test t = new test();
public test PubTest
{
get { return t; }
}
答案 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属性
如果您需要控制对结构字段的访问,那么您可以使用访问修饰符修饰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
将限制对结构上方法的访问。
答案 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; }
}
}