質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2978閲覧

なぜFileStream fs = File.OpenWrite(path);でファイルが作成されるのかがわかりません

ikemonnn

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/09/12 05:17

編集2021/09/12 05:35

初心者です。

■わからないこと

・なぜFileStream fs = File.OpenWrite(path);でファイルが作成されるのかがわかりません。どのようなことがメソッド内部で起きているのか知りたいです。

前提・実現したいこと

■実現したいこと
・ClientServerのディレクトリに html.text を生成したが内部で何が起こっているのかしりたい
・クラスのインスタンスは他クラスのメソッドで生成できる意味を理解したい
調べると
「FileStreamのインスタンスはFileクラスのメソッドでも生成が可能」だとでてきました
上記が理解できません。
そもそもFileStream クラスの中かつ継承しているクラスに FileクラスやOpenWriteメソッドがないのに使えるかがわかりません

発生している問題・エラーメッセージ

class TcpServer { public static void CreateFile(){ string path = @"C:\個人情報\個人情報\Projects\C#\ClientServer\html.text"; FileStream fs = File.OpenWrite(path); } }

試したこと

ここに問題に対して試したことを記載してください。

インスタンスの作成方法を調べた

ClassName instanceName = new ClassName();
instanceName.MethodName();

静的メソッドの場合
ClassName.MethodName();

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
IDE:vscode
言語:C#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/09/12 05:27

> ・なぜFileStream fs = File.OpenWrite(path);でファイルが作成されるのかがわかりません。 ?? そういう動きになるようにメソッドが設計され、実装されているのですが。 [File.OpenWrite(String) メソッド] https://docs.microsoft.com/ja-jp/dotnet/api/system.io.file.openwrite?view=netframework-4.8 そういう答えではなく、どうしてそのような動きがメソッド内部で実現できるのが分からないので教えて欲しい、ということなのでしょうか。 > ・ClientServerのディレクトリに html.text を生成したい これはもうできているのではないですか?
ikemonnn

2021/09/12 05:32 編集

>そういう答えではなく、どうしてそのような動きがメソッド内部で実現できるのが分からないので教え >て欲しい、ということなのでしょうか。 おっしゃる通りです。 メソッドの呼び出し方法で勉強していたのは ①インスタンスを作成してメソッドを呼び出す ②静的メソッドの場合クラス名.メソッド名 上記に当てはまらないのでどうなっているのか知りたいのが質問の趣旨です。 修正いたします。 > ・ClientServerのディレクトリに html.text を生成したい できていますのでこれも修正いたします。
dodox86

2021/09/12 05:39 編集

> ②静的メソッドの場合クラス名.メソッド名 少なくともこれはリファレンスにあるとおり、当てはまっていますよ。Fileクラスのpublic static なOpenWrite()メソッドです。 尚、[Microsoft .NET Reference Source]を辿れば実装を追うこともできます。これでは不満、あるいは難しいでしょうか。 https://referencesource.microsoft.com/#mscorlib/system/io/file.cs,1c7421e464f67b7e
ikemonnn

2021/09/12 05:47 編集

ありがとうございます!!! public static FileStream OpenWrite(String path) { return new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None); } 上記のため FileStream fs = File.OpenWrite(path)をすると OpenWrite()メソッドの中でインスタンスが生成されている認識で良いでしょうか。
退会済みユーザー

退会済みユーザー

2021/09/12 21:40 編集

ベストアンサーは gentaro さんの回答に付けるべきと思いますが? そもそもの疑問は「new FileStream() がどこにも見当たらないのに何故 FileStream のインスタンスができるのか?」ということだったようだし。
guest

回答3

0

疑問に思っているところがイマイチわからんけども…。

・なぜFileStream fs = File.OpenWrite(path);でファイルが作成されるのかがわかりません。

なぜも何も、リファレンス読めばわかる通りそういうメソッドだから。

File.OpenWrite(String) メソッド

「FileStreamのインスタンスはFileクラスのメソッドでも生成が可能」だとでてきました

上記が理解できません。
そもそもFileStream クラスの中かつ継承しているクラスに FileクラスやOpenWriteメソッドがないのに使えるかがわかりません

どこに引っかかるのか意味がわからんけど、例えばあなたの作ったクラスで

csharp

1 2class MyClass 3{ 4 public static FileStream M() 5 { 6 return new FileStream(); 7 } 8}

ってメソッドを作れば
「FileStreamのインスタンスはMyClassクラスのメソッドでも生成が可能」と言えるのと同じなので、これについて何をどう疑問に思っているんだろう。

投稿2021/09/12 05:30

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikemonnn

2021/09/12 05:50 編集

疑問に思っているところがわかりにくく申し訳ございません。 インスタンスの生成方法は ①インスタンスを作成してメソッドを呼び出す ②静的メソッドの場合クラス名.メソッド名 しか見当たらないため、なぜFileStream fs = File.OpenWrite(path);でインスタンスが生成できているのかが理解できなかったためご質問させていただきました。
dodox86

2021/09/12 06:11

gentaroさんの回答中のサンプルコードにあるように、「new クラス名()」でコンストラクタを起動してインスタンスを生成してreturnなり代入(=)演算子なりでそれを受け取れる作りにすれば良いわけで、それがstaticなFile.OpenWrite()なのです。
ikemonnn

2021/09/12 06:33

dodox86さんと皆様のおかげで理解できました。ありがとうございます!
guest

0

なぜFileStream fs = File.OpenWrite(path);でファイルが作成されるのかがわかりません。

Microsoft のドキュメント、

File.OpenWrite(String) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.file.openwrite

に以下のように書いてある通り、そういう仕様ということで納得することはできませんか?

"書き込み用に、既存のファイルを開くか新しいファイルを作成します。"

投稿2021/09/12 05:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikemonnn

2021/09/12 05:58

仕様だけだとなぜFileStream fs = File.OpenWrite(path);で インスタンスが作成されていないのに作成できるのかがわかりませんでした。 ■勉強した内容 ①インスタンスを作成してメソッドを呼び出す ②静的メソッドの場合クラス名.メソッド名 以外で作成できる方法を知らなかったため、質問させていただきました。
退会済みユーザー

退会済みユーザー

2021/09/12 06:06

File.OpenWrite メソッドは「勉強した内容」の ② だからです。紹介した Microsoft のドキュメントを見てください。以下のように static と書いてあります。 public static System.IO.FileStream OpenWrite (string path);
guest

0

ベストアンサー

File.OpenWrite(String) メソッド (System.IO) | Microsoft Docs

書き込み用に、既存のファイルを開くか新しいファイルを作成します。

...

戻り値

FileStream
指定されたパスに置かれている、非共有の FileStream オブジェクト。アクセス許可は Write です。

投稿2021/09/12 05:28

編集2021/09/12 05:30
y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikemonnn

2021/09/12 05:56

その戻り値はインスタンスが生成された状態なのでしょうか。 見当はずれな質問でしたら申し訳ございません。
y_waiwai

2021/09/12 06:08

FileStreamオブジェクトが戻り値で返される、と書いてありますね。 そのように理解すればよろしいかと
ikemonnn

2021/09/12 06:31

承知しました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問