2013-06-23 42 views
5

如何從一個實例化器傳遞給另一個實例化器?假設我們有這個班。我如何從foo(string,string)傳遞給foo(Uri)?構造函數鏈接傳遞參數的計算值

public foo 
{ 
    string path { get; private set; } 
    string query { get; private set; } 

    public foo (Uri someUrl) 
    { 
     // ... do stuff here 
    } 

    public foo (string path, string query) 
    { 
     Uri someUrl = new Uri(String.Concat(path, query); 

     // ... do stuff here to pass thru to foo(someUrl) 
    } 
} 
+0

投票重新開放。重複帖子中的答案是正確的,但更多的是將「簡單的」參數傳遞給後續的構造函數。 OP的帖子表明,在傳遞URI之前,需要對URI進行一些處理。更合適的答案是有一個通用的方法,這兩個構造函數通過引用調用和傳遞參數。 – keyboardP

+0

@keyboardP,與你同意。我修改了標題以更準確地反映,並投票重新開放。 (也查找了這個細微差別的重複,並且空了) –

+0

感謝您的重新開放。 –

回答

4

你也可以這樣做:

class Frob 
{ 
    public Frob (Uri uri) 
    { 

    } 

    public Frob(string path, string query) 
     : this(TidyUpUri(path, query)) 
    { 

    } 

    private static Uri TidyUpUri(string path, string query) 
    { 
     var uri = new Uri(string.Concat(path, query)); 

     // etc. 

     return uri; 
    } 
} 
+0

太棒了。這是我最終使用的技術。謝謝! –

7

對於簡單的構造鏈接,你可以使用特殊的關鍵字thisbase指目前或父類的其他構造。您可以使用執行構造函數的任何參數作爲鏈接構造函數的參數,並且可以使用任何合法的單個表達式將它們組合使用。除了你應該避免使用類的任何成員(因爲它還沒有被構造)並且限制自己常量和傳遞參數之外,這與應用於提供給函數調用的任何其他內聯表達式的規則基本相同:

public foo (Uri someUrl) 
{ 
    this.url = someUrl; 
} 

public foo (string path, string query) 
    : this(new Uri(String.Concat(path, query))) 
{ 
    // this.url is now set and available. 
} 

只要你需要做的處理可以在一個單值表達式中完成,這將工作。例如,如果您需要在將Uri發送到其他構造函數之前執行其他操作,或者需要一些複雜的if/then邏輯,那麼您將無法擺脫這種技術。另一種方法是重構你的代碼到一個初始化方法:

public foo (Uri someUrl) 
{ 
    this.init(someUrl); 
} 

public foo (string path, string query) 
{ 
    var url = String.Concat(path, query); 
    url = url.Replace("http://", "https://"); 

    this.init(url); 
} 

private void init (Uri someUrl) 
{ 
    this.url = someUrl; 
} 
+1

輕微挑剔,但可能更好地使'init'私有。 –

+0

我明白了!如果我有更復雜的鏈接要求,下次我會設置一個init。謝謝! –

2

既然你一起傳遞他們之前處理您的字符串,可以提取到常用方法。例如

private void ProcessUri(ref Uri theUri) 
{ 
    //...do your URI stuff here 
} 

public foo (Uri someUrl) 
{ 
    ProcessUri(ref someUrl); 
} 

public foo (string path, string query) 
{ 
    Uri someUrl = new Uri(String.Concat(path, query)); 

    // ... do stuff here to pass then call ProcessUri 
    ProcessUri(ref someUrl); 
} 

的傳球事情ref的好處是,你可以設置readonly屬性的值,就像你如果變量是在構造函數中設置。