2012-01-31 92 views
4

一直在尋找,但沒有太多的運氣,我想創建一個函數,只允許某些項目作爲第一個參數傳遞。函數中的預定義參數

例如它應該只允許下列字符串:

"error", "warning", "info" 

然後按通話將

showme("error"); 
or showme("warning"); 
or showme("info"); 

才能做到這一點?我知道我可以定義

showme(string type){} 

但最好我需要showme(string type "error"){}

+7

爲什麼不使用枚舉,並相應切換? – Rozuur 2012-01-31 12:41:58

+0

花花公子更詳細,你q不夠清楚。我不能忍受你 – 2012-01-31 12:43:18

+0

謝謝Rozuur我不確定使用情況,阿里不好意思,但問題很清楚,甚至給出了例子! – Neo 2012-01-31 13:06:35

回答

4

我建議一個enum

public enum ErrorType { 
    error, 
    warning, 
    info 
} 

public void ShowMe(ErrorType errorType) { 
    switch (errorType) { 
     case ErrorType.error: 
     //do stuff 
     break; 
     case ErrorType.warning: 
     //do stuff 
     break; 
     case ErrorType.info: 
     //do stuff 
     break; 
     default: 
     throw new ArgumentException("Invalid argument supplied"); 
     break; 
    } 
} 

//Invoke the method 
ShowMe(ErrorType.info); 
+0

請注意,使用enum *不會阻止將其他值傳遞給'ShowMe',而不是將'error','warning'和'info'傳遞給其他值。 – dtb 2012-01-31 12:52:05

+0

@dtb,你能再解釋一下嗎?在我上面的例子中,如果除'ErrorType'之外的類型傳遞給'ShowMe',編譯器會不會產生錯誤? – 2012-01-31 12:56:05

+1

是的,如果'ErrorType'以外的類型傳遞給'ShowMe',編譯器會產生一個錯誤。但我正在討論'ErrorType.error','ErrorType.warning'和'ErrorType.info'之外的'ErrorType'類型的值。例如,您可以在沒有任何編譯時或運行時錯誤的情況下將'(ErrorType)42'傳遞給'ShowMe'。這就是爲什麼你需要一個'默認'的情況。 – dtb 2012-01-31 13:01:27

0

可以包取決於您所設置的值與私有構造函數的類的邏輯,並且無論是通過檢索實例單身屬性或通過工廠方法。

喜歡的東西:

public class StringConstraint 
{ 
    private StringConstraint() 
    public static readonly StringConstraint error = new StringConstraint() 
    ... 

    public void DoStuffWithStringValue() 
    { 
     // Here you do the logic that depends on your particular string value 
     // e.g. (always) log a message as an error 
    } 
} 

這迫使你永遠只傳遞符合要實現爲每個三根弦的邏輯實例。