2013-07-29 23 views
0

缺點目前執行的:爲什麼呼叫者信息屬性以他們的方式實現?

  • 他們違反了DRY原則,你必須處處參數重寫你需要他們
  • 他們毀實現隱藏,你必須指定這些參數已經在接口 - 即使只有你的接口實現的單一一個需要他們
  • 他們弄髒界面,用戶看到他們在自動完成,文檔等頁。

爲什麼語言d esigners決定了一些更有用的東西,比如:

public void Foo() 
{ 
    Console.WriteLine(CallerInformation.File); 
} 

我猜這個實現缺少一些特性:如果Foo()是一個實現IFoo的類,並且IFoo在另一個程序集中,那麼IFoo的調用者在編譯時應該如何知道這些信息是必需的 - 他不知道這一點。

但是!記住這隻能在一個「構建步驟」內工作,而不是像目前的實現那樣產生一些不可用的東西,這不是更好嗎?

Q1:是否有官方文件說明爲什麼它現在以這種方式實施?

Q2:有人知道其他語言的更好的解決方案嗎?

+1

「CallerInformation.File」究竟如何工作?您是否會在執行時爲每個*調用填充它?你將如何通過多種方法傳播它?目前的實現基本上沒有*執行時間成本。如果你打算提出一個替代方案,你需要更清楚地瞭解它的實際工作方式。 –

+0

由於某些屬性,當前呼叫者知道「他的職責」。爲什麼不至少使用方法級屬性而不是參數級屬性來防止界面污染? (我知道它並沒有消除我所有的缺點) –

+0

它爲參數*提供了一個值*。方法級別屬性是否必須命名它所應用的參數?聽起來有點icky。雖然我可以看到你提到的缺點,但我認爲你迄今還沒有提出任何更好的建議。 –

回答

0

調用者信息屬性在語義上與方法參數相關(如'如果沒有爲此字符串參數指定任何值,則將調用者成員名稱放在其中而不是使用null作爲默認值'),因此我沒有理由爲什麼它們不應該像現在一樣在語法上也是相關的。

他們違反了DRY原則,你必須處處參數重寫你需要他們

其他方法也需要每次都想給呼叫者成員名稱分配給一個時間做東西變量,如:param = param ?? SomeExpressionToGetSomeValue

他們毀實現隱藏,你必須在接口上已經指定這些參數 - 即使只是你的接口實現的單一一個需要他們

關於實現隱藏:它是調用者提供參數的責任,所以這應該在接口中(除非運行時決定總是在所有調用中提供這樣的信息,這就像隱含地提供參數一樣)並且在幕後提供暗含/神奇的參數似乎不是對我更好的方法)

關於必須指定在接口中指定那些參數 - 即使只有一個接口實現需要它們:只需指定屬性和參數(如果需要)。這就是數學的原因。ABS是聲明爲公共靜態INT ABS(int值),而不是爲公共靜態INT ABS(int值,對象ThisIsNotNeededButLetsJustHaveItHereItAnyways)

他們弄髒界面,用戶看到他們在自動完成,文檔等PP 。

哦,我倒看不出爲什麼你認爲這是一件壞事 - 如果調用者應該提供它的名字,它應該是在文檔等


你彷彿暗示自己是像閱讀堆棧幀,這將編譯和運行,但可能不是你所期望的:

private void SomeMethod() 
{ 
    return new StackFrame(1).GetMethod().Name; 
} 

上面的代碼將在運行得到了來電者的名字,但它可能不是一樣的名字由於內聯或尾部呼叫優化,在編譯時間調用者。

因此,如果該方法想要在編譯時(不是運行時)期間調用者的信息,那麼這種方法就行不通。

相關問題