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

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

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

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

950閲覧

あるクラスに定義されたフィールドに、別のクラスを介してアクセスする方法を知りたいです

Jackal661

総合スコア7

C#

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2020/04/19 11:45

編集2020/04/19 13:23

実現したいこと

C#を一週間程度かじった初心者です。用語やコードの書き方など間違っていたらご指摘頂ければと思います。

あるクラスに定義されたフィールドに、別のクラスを介してアクセスする方法を知りたいです。
例えば、下記のようなコードの場合です。

下記コードではtekito2クラスにtekito1クラス型のフィールド a があります。
また、tekito2クラスとtekito1クラスにはそれぞれプロパティが用意されています。
私がやりたかったことはtekito2クラスをインスタンス化し、このクラス内にあるtekito1クラス型のフィールド a を使ってtekito1にあるフィールド c にそれぞれのプロパティを用いて値を代入することでしたが、NullExceptionエラーで上手く動きませんでした。

以上を踏まえ、2点ほど質問させて頂きたいと思います。

1、今回のコードでのエラーをどのように解消すれば良いでしょうか?
Google検索するとNullアクセスが起こっているようなのですが、なぜこれが問題なのか、どうして起こったのかがそもそも良く分からず、解決方法を見出せませんでした。

2、エラーの件とはあまり関係ないかもしれませんが、フィールドをprivateではなくpublicにするのはC#的には良くないことなのでしょうか?

以上になります。初歩的な質問ですがご教授頂ければと思います。
よろしくお願いいたします。

該当のソースコード

C#

using System; using System.Collections.Generic; public class Hello{ public static void Main(){ var value = new tekito2(); value.Property2 = 20; } } public class tekito1{ int c ; public int Property{ get{ return c; } set{ c = value; } } } public class tekito2{ tekito1 a ; public int Property2{ get{ return a.Property; } set{ a.Property = value; } } }

発生したエラーの内容

Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
at Hello.Main () [0x00007] in /workspace/Main.cs:8
[ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
at Hello.Main () [0x00007] in /workspace/Main.cs:8

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/19 12:28

コードは ``` と ``` で囲ってください(``` はバッククォート 3 つです)。インデントされて見やすくなるので。インデントされてないコードは自分でも読む気がしないのでは?
Zuishin

2020/04/19 12:52

a = new tekito1(); エラーの直接の原因は↑が無いからですね。 > at Hello.Main () [0x00007] in /workspace/Main.cs:8 Main.cs の 8 行目で例外が起きていることが示されています。 それ以前に、適当なテキストエディタではなく Visual Studio を使いましょう。
Zuishin

2020/04/19 13:27

行間が狭いということではなく、マークダウンのコードブロックを使うと読みやすくなるということです。PC で質問を編集すると、ツールバーが出てきて <code> というボタンがありますよね? それを押すと ``` が出てきます ```C# ここにコードを書く ``` このように、``` と ``` の間にコードを挟んでください。``` は行の途中ではなく、一行取り、最初の ``` には C# と書いてください。
Zuishin

2020/04/19 13:30

それと、現状、最後の ``` の行頭に半角スペースが入っています。このためコードブロックになっていません。行頭の余計なスペースを削除してください。
Jackal661

2020/04/19 13:40

SurferOnWwwさん  ご指摘ありがとうございました。インデントされるよう編集しました。 Zuishinさん ご回答ありがとうございました。セットアクセサーにtekito1のインスタンスを生成したところ、上手く実行できました。また、今後はvisual studioを使用するように致します。
Zuishin

2020/04/19 13:43

こういうインデントじゃないです。他の質問や解答を見ると、プログラムの部分が明らかに違う見た目になっているものがありませんか?
guest

回答1

0

ベストアンサー

1、今回のコードでのエラーをどのように解消すれば良いでしょうか?

Google検索するとNullアクセスが起こっているようなのですが、なぜこれが問題なのか、どうして起こったのかがそもそも良く分からず、解決方法を見出せませんでした。

まず、どれでもいいのでC#の入門書を一冊購入して、頭から読みましょう。
かなり基本的な部分を理解されていないようなので、そのような疑問をひとつのひとつ質問で潰すより、まず体系的な学習をされた方が良いです。

どんなに酷い入門書であっても「クラスとインスタンス」について説明があると思いますし、そこで初期化する必要性などは解説していると思います。

ネット上で検索するならこういう記事でも良いんですが、基本的な事を全部まとめて理解するには、本を読んだ方が良いです。

公式のリファレンスでも良いのですが、例えば

2、エラーの件とはあまり関係ないかもしれませんが、フィールドをprivateではなくpublicにするのはC#的には良くないことなのでしょうか?

これについては
フィールド (C# プログラミング ガイド)

通常、フィールドは、プライベートまたは保護されたアクセシビリティを持つ変数に対してのみ使用します。 クラスからクライアント コードに公開するデータは、メソッド、プロパティ、およびインデクサーを使用して提供する必要があります。 これらの構成要素を使用して、内部フィールドに間接的にアクセスすることで、無効な値が入力されることを防止できます。 パブリック プロパティによって公開されるデータを格納するプライベート フィールドは、バッキング ストアまたはバッキング フィールドと呼ばれます。

このような解説が見つかります。

投稿2020/04/19 12:14

編集2020/04/19 12:16
gentaro

総合スコア8949

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

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

Jackal661

2020/04/19 13:44

gentaroさん ご回答ありがとうございました。今までネットで掻い摘んで覚えた気でいましたが、専門書を読み漁ることにします。 自分がC#について殆ど理解しておらずこのような質問をしてしまい、申し訳ありません。 正しく理解できるように精進します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問