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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

受付中

C#でユーザー定義のstring型を使いたい

kokorin
kokorin

総合スコア73

C#

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

3回答

0評価

0クリップ

528閲覧

投稿2022/02/20 02:45

シチュエーションとしては、
string型をstring型ではない別の型として定義することで実装ミスに事前に気づけるようにしたいです。

例えば、string型でif文の判定をする場合、

C#

string item = "book"; int price; if (item == "book") { price = 100; } else { ... }

のように書くかと思いますが、
string型だと他のどんなstring型でも比較できてしまうことで不具合につながるので、悩みどころです。

C#

string userName = "John"; int price; if (userName = "book") { // UserNameはそもそもここで比較されるべきではない price = 100 } else { ... }

これを、string型をラップ?するようなMyString型があれば、

C#

MyItemString item = "book"; string userName = "John"; int price; if (item == (MyItemString)"book") { price = 100; } else if (userName == (MyItemString)"book") { // 型が違うためコンパイルエラーになる price = 200; } else { ... }

のようにコンパイルエラーとしてビルド時に間違いに気づくことができるかと思います。

【質問】

  1. ユーザー定義のstring型を作成することはできますか?
    また、できる場合はその方法をお教え頂けるとありがたいです。
  2. 上記のようなstringの比較の実装ミスによる不具合を防ぐ別の方法はありますか?
    できれば、ユーザー定義型のstringとして扱いたいですが、より良い方法があればご教授いただきたいです。

以上、皆さんのお知恵をお貸しいただければ嬉しいです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2022/02/20 02:52

あまりメリットのあるこのをやろうとしてるようには見えないのですが(大事なのは変数が保持している情報そのものだと思うので)、実装も例ではなく具体的な要件のほうが良いかと思います。 >stringの比較の実装ミス ここが他者にはイメージ伝わりにくいのではと。
Zuishin

2022/02/20 03:00

enum を使うか、if の代わりに switch 式を使えば良いと思います。
SurferOnWww

2022/02/20 03:30 編集

インターンプールというのがあるのをご存じですか? 文字列を key に、ヒープ上の String オブジェクトのアドレスを value に持つハッシュテーブルのようなものです。コードに "John" と書くとコンパイルされる時にそれはインターンプールに置かれます。なので、質問者さんが書いたようなコード (MyItemString)"book" のようなことをするのは不可能かと思います。
kokorin

2022/02/20 04:09

@m.ts10806 > あまりメリットのあるこのをやろうとしてるようには見えないのですが 具体的にどのような理由でメリットがないと感じられましたか? コンパイル時点で実装ミスに気づけるという意味で十分メリットがあると考えています。 > 大事なのは変数が保持している情報そのものだと思うので こちらに関しては自分も同意です。ただ、「型」にも情報が含まれており、変数+型含めての情報ですよね? 変数に入っている情報のみでプログラムが構成できるのであれば、クラスを始めとするユーザー定義型は必要ないはずですし @Zuishin 質問の書き方が悪かったためか、意図が伝わっておらず申し訳ございません。 enum/if/switch式による実装がどうこうという意味ではなく、string型をそのまま使うことで他のあらゆるstringと比較されうるということに危険性があり、それを解消したいということです。 @SurferOnWww インターンプールというのは知りませんでした。 stringの場合に使用される保存領域ということですかね。 > コードに "John" と書くとコンパイルされる時にそれはインターンプールに置かれます。なので、質問者さんが書いたようなコード (MyItemString)"book" のようなことをするのは不可能 stringがインターンプールに置かれるので、不可能ということですが、理由と結論の間にギャップがあり理解できませんでした。 (MyItemString)"book"のようにキャストすることが無理ということでしょうか? それとも、そもそもstringから派生させたようなユーザー定義のstring型を作成することが無理ということでしょうか?
SurferOnWww

2022/02/20 04:50

> インターンプールというのは知りませんでした。 String Intern などをキーワードにググって調べるなどして勉強してください。 > (MyItemString)"book"のようにキャストすることが無理ということでしょうか? 何故そういうことができると思うのか分かりません。ご自分でやってみて、もし出来たら、どのようにしたのか逆に教えてもらえませんか?
Zuishin

2022/02/20 05:11

TypeScript の共用体型のようなものをお望みでしょうか? https://js.studio-kingdom.com/typescript/handbook/advanced_types#union_types それなら、将来のバージョンで入る計画はありますが、今のところはできません。 enum を使用するのが最も近いと思います。 > (MyItemString)"book"のようにキャストすることが無理ということでしょうか? 演算子のオーバーロードを使えばできなくはありませんが、それで問題が解決するかは疑問です。
SurferOnWww

2022/02/20 06:21

> 演算子のオーバーロードを使えばできなくはありませんが そうですね、前言「何故そういうことができると思うのか分かりません」は取り消します。失礼しました。
fana

2022/02/21 01:34

> string型だと他のどんなstring型でも比較できてしまうことで不具合につながる この話の意味がわからないです… あるデータAの内部表現(っていうか)が文字列であってそれをstringとして実装し, Aとは別の意味合いのデータBの内部表現もまた文字列であってstringとして実装したとき, AとBは全く異なる概念であるから「AとBを比較する」というのは「話の上では異常事態」なのだけどもコード的に(型的に)は問題ないのがなんか嫌だ …的な話なのでしょうか? (もしもそういう話なら,AもBもstring丸出しで実装しなければ良いというだけなのでは…? 内部表現がstringたることがmustだとして,それを抱えている型を適当に用意するのではダメなのか?)

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。