DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#でのクラスの内のthisの参照の仕方

環境/言語:[C# NET Framework3.5]
分類:[.NET]

別のクラスからForm1クラスを参照し値を参照したいのですが
thisを別のクラスの中に引数で渡し参照がうまくいきません。

Console.WriteLine( b1.test );で参照しましたがうまく参照できません
でした。

どなたかご教授をお願いします

public partial class Form1:Form {
 clsSample c;
  public string test = "1";

  public Form1() {
   InitializeComponent();
   c = new clsSample(this);
  }
}

class clsSample {
  public Form1 b1;
  public clsSample(Form1 b) {
    b1 = b;
  }
  private test() {
   Console.WriteLine( b1.test );
  }
}
■No26157に返信(たなかさんの記事)
>   private test() {
これはコンパイルエラーになるはずですよ。
「private void test() {」や
「private clsSample() {」ならば OK ですが。


で。とりあえず、下記のコードで出力されました。
# 手元に Visual Studio が無かったので、メモ帳で書いて実験。

下記のファイルを C:\sample.cs として保存して…
//---------------------
using System;
using System.Windows.Forms;

public partial class Form1:Form {
 clsSample c; 
 public string test = "1";

 public Form1() {
  //InitializeComponent();
  c = new clsSample(this);
 }
 public static void Main() {
  Application.Run(new Form1());
 }
}

class clsSample {
 public Form1 b1;
 public clsSample(Form1 b) {
  b1 = b;
  test();
 }
 private void test() {
  Console.WriteLine( b1.test );
 }
}
//---------------------

コマンド プロンプトで下記を実行

%WINDIR%\Microsoft.NET\Framework\v2.0.50727\CSC.EXE /target:exe /out:C:\sample.exe C:\sample.cs


コマンド プロンプトから、生成された C:\sample.exe を実行した所、
期待通り「1」と表示されました。

なお、オプション指定を /target:winexe に変更した場合には、
そのままでは出力結果を読めないので、
 C:\sample.exe | MORE
などとするか、ファイルに
 C:\sample.exe > C:\result.txt
などとリダイレクトしないと分かりにくいですね。
魔界の仮面弁士さん 返信ありがとうございます。

さっそく試してみました。
clsSample内のForm1が認識されなかったのですが
clsSample 内に using WindowsFormsApplication1; を追加することで
Form1 名前空間を認識できました。
今出ているエラーは
class Form1内でc = new clsSample(this);の箇所で
「'clsSample'に、引数を1個指定できるコンストラクタがありません。」
とでています。

もう少しでできそうな気がしています。

namespace WindowsFormsApplication1 {
  public partial class Form1:Form {

    clsSample c;
    public string test = "1";

    public Form1() {
     InitializeComponent();
    }

   private void Form1_Load(object sender,EventArgs e) {
     c = new clsSample(this);
    }
  }
}

using System;
using System.Windows.Forms;
using WindowsFormsApplication1;

class clsSample {

  public Form1 b1;

  private clsSample(Form1 b) {
   b1 = b;
   test();
  }
  private void test() {
   Console.WriteLine(b1.test);
  }
}
■No26164に返信(たなかさんの記事)
> clsSample 内に using WindowsFormsApplication1; を追加することで
No26157 にそのような記述は無かったので、
No26158 ではそこまで考慮していませんでした。(^^;

> class Form1内でc = new clsSample(this);の箇所で
> 「'clsSample'に、引数を1個指定できるコンストラクタがありません。」
> とでています。

「clsSample(Form1)コンストラクタ」は
> class clsSample {
>   private clsSample(Form1 b) {
のように、『private』になっていますよね。

そのため、このコンストラクタを利用できるのは
clsSample 自身(またはその下位のクラス)だけとなります。
http://dobon.net/vb/dotnet/beginner/accessibilitylevel.html
魔界の仮面弁士さん

ありがとうございます!できました。
publicのところをprivateにしていました。

Form1を参照するのにusing WindowsFormsApplication1; を書いてなかったのが
今回の原因でした。

どうもありがとうございました!

> 「clsSample(Form1)コンストラクタ」は
>>class clsSample {
>>  private clsSample(Form1 b) {
> のように、『private』になっていますよね。
>
> そのため、このコンストラクタを利用できるのは
> clsSample 自身(またはその下位のクラス)だけとなります。
> http://dobon.net/vb/dotnet/beginner/accessibilitylevel.html
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板