您擁有的代碼相當愚蠢。也許這只是一個例子,但從文件中讀取兩次字符串沒有意義,只是爲了做一個比較。讀取一次字符串,將其存儲到一個變量中,然後對變量進行比較。
此外,您應該處置您的StreamReader
對象。更好的是,將其創建包裝在using
區塊中以確保其自動處置。
就你所說的實際問題而言,你可以用object
或dynamic
類型聲明myVar
變量。
當與條件操作相結合時,這也將解決您的變量範圍問題。
總之,類似如下:
public static int Main()
{
dynamic myVar;
using (var file = new StreamReader("input.txt"))
{
var line = file.ReadLine();
if (line == "Struct A")
myVar = new A();
else if (line == "Struct B")
myVar = new B();
else
// You really should be handling the case where the line in the file
// contains neither "Struct A" or "Struct B". That will result in
// myVar being left in an invalid, uninitialized state.
throw new InvalidOperationException();
}
// do something with myVar, e.g.:
return myVar.a;
}
當然,這不是一個銀彈。 使用myVar
除了最簡單的情況,例如您在問題中顯示的情況,其中A
和B
都有一個成員a
,將會非常困難。動態類型的工作方式是編譯器等待直到運行時才確定變量的類型。 (就CLR而言,dynamic
只是object
類型的變量。)這意味着當myVar
實際上是B
時,您將無法使用A
的方法/屬性/成員,反之亦然。你需要一些方法來跟蹤myVar
的實際類型。有更好的方法來做這件事,比如實現一個通用接口。
您可以將'myVar'定義爲'object'。或者'動態'。 – Rob
如果可能的話,你打算如何使用* myVar *? – bit