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

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

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

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

Q&A

解決済

2回答

3883閲覧

stringをbyte配列に変換するのに、どのbyte配列宣言が正しいのでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2017/03/31 04:43

byte配列使い方について、下記3パターンのどれが正しいのでしょう?(結果は全て正解です)
また、それぞれの解説があれば、お願いします。
*3)は、領域を1個(byte[1])でも、結果は、正解です。正解の様に見えるだけで、
実は、内部でバグっているのでしょうか?

  1. byte[] bt = System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes("ABCDEF");

  2. byte[] bt;
    bt = System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes("ABCDEF");

  3. byte[] bt = new byte[1];
    bt = System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes("ABCDEF");

環境 Windows7 pro
言語 C# Visual Studio 2015

組み込み型 Cは、理解しているつもりです。オブジェクト指向C#は、まだ初心者で、直ぐ”C”と比べしまい
パニックに陥ります。

ご教授宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

1)でよいと思います。

2)は変数を宣言してから直後で代入としていますが、そのようなスタイルを採る理由はあまりないと思います。例えば昔のC言語は「変数は全部ブロックの先頭で宣言しなければならなかった」ため全ての変数の宣言とその設定を別々にやったりしたものですが、C#では(確か現在のC言語の仕様でも?)「変数は必要な場所で宣言・設定」ができるようになっており、「変数の有効範囲=スコープ」を無暗に広くしないという望ましいプログラミングができるようになっていますね。例えばその変数を参照したいスコープをあえて広げるために値を設定する箇所の外側のスコープで宣言するなんて理由でもない限りはあまりやらないコーディングといってよいでしょう。

3)は2)や1)に比べて「バグ」といってもいいくらい良くないコードだと思います。初期設定している値は次の代入文ですぐに捨てられてしまうのでまったく意味を持ちません。GCで回収しなければならないオブジェクトを無駄に増やしているだけと言えましょう。

投稿2017/03/31 05:02

KSwordOfHaste

総合スコア18394

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

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

Zuishin

2017/03/31 05:33

2 も 3 も間に何か処理を挟むんじゃないでしょうか? 少なくとも私は変数の宣言だけ先に行うコードを何度も書いたことがあります。out で宣言できなかったバージョンの時とか必須でした。
Zuishin

2017/03/31 05:35

例えば、ループの中で宣言した変数はループが終わった後では使えません。使いたい時にはあらかじめ外で宣言する必要があると思います。
KSwordOfHaste

2017/03/31 05:40

おっしゃるとおりと思います。 ただ自分としては「その変数を参照したいスコープをあえて広げるために値を設定する箇所の外側のスコープで宣言するなんて理由でもない限りは」と申し上げたように、「そうせずにすむならしないにこしたことはない」という考えです。
Zuishin

2017/03/31 05:47

すみません。その部分を読み落としていたようです。
退会済みユーザー

退会済みユーザー

2017/03/31 05:47

有難う御座います。 1)と2)を場面で判断し、使い分けます。
guest

0

すべて正解です。状況に応じて使い分けましょう。
C が理解できている人に解説要りますか?

3 については、ポインタのようなものだと思ってください。あらかじめサイズ 1 のバッファで初期化して、次に別のバッファを割り当てています。最初のバッファに書き込まれているわけではありません。

投稿2017/03/31 04:53

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2017/03/31 05:52

有難う御座います 記述は良く似ていますが、CとC#は、かなり考え方が違うと思います。 ”ポインタのようなもの”、そこなんですよ。そこがスッキリしない所なんです。 でも、回答頂き、少しスッキリしました。
ozwk

2017/03/31 06:39

そんなスッキリしませんかね?”ポインタのようなもの”って。
退会済みユーザー

退会済みユーザー

2017/04/04 04:24

返事遅くなりすいません。 もう少し勉強します。 有難う御座いました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問