2009-12-10 232 views
1

爲什麼我不能有私人的struct然後從它創建一個公共屬性?C#屬性無法訪問

當我編譯時,我得到'屬性PubTest不如測試'。

例如爲:

private struct test 
{ 
    int a; 
    double b; 
} 

test t = new test(); 

public test PubTest 
{ 
    get { return t; } 
} 
+0

如果它是公開的,爲什麼它是私人的? – Paul 2009-12-10 18:14:30

回答

12

外部調用代碼必須知道屬性的返回類型。

如果struct是私人的,它不能從外面看到。

+0

好!那麼,如果我仍然想要一個屬性,我該如何保持結構的內部? – 2009-12-10 18:15:30

+1

如果外部調用代碼需要使用'struct'私有是沒有道理的。你想讓它變得私密的原因是什麼?這可能會幫助我們找到解決方案。 – 2009-12-10 18:18:06

+0

如果您仍然想要在包含類型中定義測試,但從包含類型的測試類型中公開測試屬性,請將測試公開。不採取包裝私人類型的實例,實際上沒有辦法解決可訪問性問題。也許你應該編輯你的問題,並詳細說明你想要在更高層次上完成什麼? – 2009-12-10 18:19:42

0

因爲struct是私有的,它只能訪問包含它的類型(你沒有在你的例子顯示,但我會打電話給T爲了簡潔)。如果T擁有公共財產,則該財產的消費者必須執行從財產返回的類型...但它不會,因爲您將該類型聲明爲T的私有類型。

0

聽起來好像你認爲在結構上設置「private」會改變成員的默認訪問級別。那是而不是發生了什麼。該結構的所有成員的默認訪問級別仍然是公共的;他們可以在任何地方看到你的新結構類型可以看到。

什麼改變是結構類型本身是私人的;它只對你聲明它的類是可見的(並且它必須在類中而不是名稱空間中,因爲你不能在名稱空間中聲明它是私有的)。它根本無法在那裏訪問。這意味着即使使用該程序集中的結構,也必須小心。如果程序集中的公共或內部類型從公共或內部方法返回它,則可能會將其暴露給允許使用的地方以外的世界,這是一個編譯錯誤。

2

不能暴露自身結構,如果是私人的,但可以公開它的成員:

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

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

這是你可以在這裏做的最好。

0

與其他人一樣,結構必須至少與房產一樣可見。如果你只是想揭露結構,外部的代碼的惡魔,你可以使用這樣的事情:

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

    Test test = new Test(); 

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

是的,你是對的,這是毫無意義讓它私有,如果我需要訪問它從外。我想要的是隻讀訪問該類的成員之外的類。這就是爲什麼我試圖隱藏它,只有一個getter屬性

如果您需要控制對字段的訪問結構體,那麼你可以用如下的訪問修飾符修飾方法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將限制對結構上方法的訪問。

+0

「內部」修飾符不一定限制對OP成員的訪問。 – 2009-12-10 18:42:10

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