爲什麼我不能有私人的struct
然後從它創建一個公共屬性?C#屬性無法訪問
當我編譯時,我得到'屬性PubTest不如測試'。
例如爲:
private struct test
{
int a;
double b;
}
test t = new test();
public test PubTest
{
get { return t; }
}
爲什麼我不能有私人的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