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

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

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

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Q&A

解決済

1回答

2295閲覧

C#のメッセージ「CA2211:非定数フィールドは表示されません」について

mmmisaki

総合スコア34

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

0グッド

0クリップ

投稿2022/09/22 05:53

編集2022/09/22 06:09

以下のようなソースコードを書いた場合
public static int Test = 3;の箇所で「CA2211:非定数フィールドは表示されません」と表示されます。

ドキュメントを読むと「読み取り専用でもない静的フィールドは、スレッド セーフではありません。」とあるのでメッセージの意味は理解できました。

しかし以下のようにコードを修正するとメッセージが抑制されます。get; set;があるのとないのでなにが違うのでしょうか?

public static int Test { get; set; } = 3;

環境はwindows10 21H2,visual studio 2022, .NET6.0です。

ソースコード

c#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6//Class1.cs 7namespace ConsoleApp1 8{ 9 public static class Class1 10 { 11 public static int Test = 3; 12 } 13} 14

c#

1//Program.cs 2namespace ConsoleApp1 3{ 4 class Program 5 { 6 static void Main() 7 { 8 Console.WriteLine(Class1.Test); 9 Class1.Test = 1; 10 Console.WriteLine(Class1.Test); 11 } 12 } 13}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/09/22 06:01

開発環境を書きませんか? OS, Visual Studio のバージョン、.NET Framework or .NET Core/.NET どっちかとそのバージョンなど。 エラーメッセージは翻訳がアレです。英文では "Non-constant fields should not be visible" です。それで理解が変わってきませんか?
mmmisaki

2022/09/22 06:18 編集

開発環境を追記いたしました。 なるほど、get; set;でプロパティ明記することで参照を制限するのを忘れているのではなく、他から参照できるようにしたいというのが伝わるから抑制されたという感じでしょうか?
Zuishin

2022/09/22 06:43 編集

「定数でないフィールドは公開すべきではない」という意味です。 フィールドは public ではなく protected や private にし、公開するならフィールドではなくプロパティにしろという警告です。
guest

回答1

0

ベストアンサー

オブジェクト指向の概念の一つ「カプセル化」を実現するため、通常クラス内の各フィールドへの直接アクセスは禁止するようにしておき、外部からはパブリックプロパティで各フィールドの値を取得したり設定したりするというのが普通のやりかたです。フィールドを public にするのはまずそれに反します。

問題の CA2211 ですが、試してみたところ .NET 5.0/6.0 で、さらに static を付与する(質問のコードのように public static にする)と出ました。ということは C# v9.0 から出るようにしたのでしょうか。

想像ですが、static にするとアクセス可能範囲がアプリ全体に広がってスレッドセーフでないことの問題が顕著化しやすいので、このようなフィールドへのアクセスは慎重に制御する必要があるということで C# 9.0 から警告を出すようにしたのではなかろうかと思います。

以下のように、フィールドを public から private に変えて、public プロパティ経由でアクセスするようにすると CA2211 が出なくなります。これも想像ですが、ちゃんとカプセル化されて「アクセスは慎重に制御」されているいるとみなされるからではなかろうかと思います。

public static class Class1 { private static int _Test = 3; public static int Test { get { return _Test; } set { _Test = value; } } }

投稿2022/09/22 07:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問