2014-09-19 100 views
2

System.IO.File沒有構造函數。改爲使用創建/打開靜態方法。爲什麼.NET System.IO.File使用Create/Open而不是構造函數?

爲什麼不創建或使用構造函數打開文件?

調用構造函數是否意味着調用構造函數的代碼「擁有」該對象,而不是像文件那樣的對象只是將句柄包裝到文件系統擁有的文件的情況?這是一些OOP約定,一個.NET/C#約定,還是這只是純粹的任意?

+0

在C++中,可以使用標誌來構造std :: fstream來指定打開現有文件或創建新文件。但是它也允許空的構造,隨後調用打開標誌來控制是創建新文件還是打開現有文件。也許C#的做事方式是OOP的更現代版本。 – JDiMatteo 2014-09-19 19:48:40

+0

我認爲*創建*和*打開*與操作相關聯,而不是對象。你*打開*文件,你不*創建*「打開」。由於這些操作不與實例關聯,因此它們變爲靜態。 – 2014-09-19 19:48:42

+0

當然,你可以創建一個File對象,並以某種方式指定是否打開它或創建它或什麼。這將導致各種令人費解的建設者。工廠模式完全是你想要的。設計是正確的。 – 2014-09-19 19:56:38

回答

8

File類是.NET Framework 1.0版的後添加。在微軟進行可用性研究之後添加。他們邀請以前從未使用.NET的程序員,並要求他們編寫使用FileStream和StreamWriter類的代碼。那些有一個構造函數。成功率爲

所以他們想出了File,它有一堆創建/打開文件的靜態幫助器方法。把它們想象成工廠方法。不,你不創建一個文件。你用吧。請查閱您最喜愛的C#編程語言書籍靜態類

9

File.CreateOpen實際上並沒有實例化一個File,它們返回一個新的FileStream用於訪問磁盤上的文件中的數據。

它們實質上是FileStream Constructors的工廠方法,其中作爲FileStream實例的構造函數處理。

1

File只是爲您實例化其他類的幫助器類。 「文件」本身是文件系統上的一個對象,而不是.NET。所以你有流,讀者,FileInfo等,這些都代表了與文件交互的不同方面。 .NET中的類只是通向所有這些不同類的入口。

+0

這是一個OOP術語嗎?或者這是一些模式的例子嗎?我有點明白你在說什麼,但是我發現很難說清楚什麼樣的類代表不在.NET中的對象。例如,如果數據庫創建/打開而不是構造函數,那麼遵循相同的思路?代表存儲在該數據庫中的事物的類是什麼? – JDiMatteo 2014-09-19 19:57:49

+0

鑑於你可以構造一個FileStream實例,我開始懷疑你對「不在.NET中」的對象的推理。相反,我認爲任何對象都可以被認爲是在.NET中,或者爲什麼它會是一個對象呢? – JDiMatteo 2014-09-19 20:10:11

+1

@JDiMatteo'File'類是門面模式的一個例子。有一些方法可以簡化常用操作,如打開,複製,移動和將文本寫入文件。有人可能會調用一些方法工廠方法,因爲它們爲客戶端代碼創建'FileStream'對象。 – 2014-09-19 22:19:51

相關問題