【Unity/C#】delegateが全然理解できません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wakaranasugy

【Unity/C#】delegateが全然理解できません。

#1

投稿記事 by wakaranasugy » 3ヶ月前

件名の通りです。
デリゲートの書き方がチンプンカンプンです。

メソッドを委譲したい時に使うもの、ということは分かるのですが...

ネット上のサンプルコードも幾つか見ましたが、どの部分がデリゲートの核たる部分なのか分かりませんorz

デリゲートを使った最も簡単なサンプルコードを、どなたか書いて頂けないでしょうか。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#2

投稿記事 by Math » 3ヶ月前

フォーラムルールを一読してやって下さい。
[フォーラムルールより]
以下のテンプレをコピペして、

各項目に対して答える形で記載して下さい。


[1] 質問文
 [1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : Windows, Linux等々
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々

[3] その他
 ・どの程度C言語を理解しているか
 ・ライブラリを使っている場合は何を使っている

[追記]
UnityのVersion,VisualStudioのVersion,どの程度Unity、VisualStudioを理解しているか記述をお願い致します。それと分かる範囲でコードを記述してください。
ーーーーーーーーーーーーーーーーーーーーーーーーーー
(当方はUnity2007.3 VisualStudio2017Communityを使用しています。過去ログで何度かdelegateについて答えています。Versionによって書き方が変化して来てdelegate命令が表に出てこない例が多くなりました(C#側で宣言済みのものが多数あります)。いまはラムダ式などに取って代わられているので、.NETFramework2.0,3.0の頃の説明を読むと良くわかるはずです。(私のホームページに 初歩の例を沢山書いていたたのですが最近引越しの為削除してしました。(><)

ISLe
記事: 2607
登録日時: 7年前
連絡を取る:

Re: 【Unity/C#】delegateが全然理解できません。

#3

投稿記事 by ISLe » 3ヶ月前

デリゲートより前は、間接的にメソッドを呼び出す方法として使えたのは
1. 静的なメソッド(クラスメソッド)の参照を経由する
2. 特定のメソッドを持つ特定のクラス(あるいはインターフェース)にアップキャスト可能なインスタンスを経由する
という方法だけでした。

1. はメソッド単体で使うので、状態を持つことができません。
状態を扱うには引数でインスタンスを与えるといったオブジェクト指向らしからぬ手段を用いる必要があります。

2. は状態を持たせられますが、継承が必須となり、多重継承の問題を抱えることになります。

そこで、メソッドのシグネチャのみを対象とし、メソッドが何に属しているかを不問とする方法ができました。
それが、一般的にデリゲートと呼ばれる仕組みです。

コード: 全て選択

using System;

delegate void DelegateMethod(); // デリゲート型を定義: このシグネチャを持つメソッドを扱う

class Foo
{
    public void ShowFoo() { Console.WriteLine("Foo"); }
}
class Bar
{
    public void ShowBar() { Console.WriteLine("Bar"); }
}

class DelegateSample
{
    static void A() { Console.WriteLine("A"); }

    static void Main()
    {
        Foo foo = new Foo();
        Bar bar = new Bar();

        DelegateMethod m = A; // デリゲート型の変数にメソッドの参照を格納
        // 追加できる 呼び出しの際は追加した順番に呼び出される
        // FooとBarは異なる型だがメソッドのシグネチャが一致すればOK
        m += foo.ShowFoo;
        m += bar.ShowBar;
        // クラスメソッドもインスタンスメソッドも同じく扱える
 
        m(); // 呼び出し
    }
}

よもやま
記事: 43
登録日時: 2年前
連絡を取る:

Re: 【Unity/C#】delegateが全然理解できません。

#4

投稿記事 by よもやま » 3ヶ月前

オフトピック
多重継承といえば、昔Borland C++についてたC++クラスライブラリがあったなー
登場からもう30年近くにもなるのかー。
今もC++ Builderなどで使えたりするぽい。
Object Windows Library

Math

Re: 【Unity/C#】delegateが全然理解できません。

#5

投稿記事 by Math » 3ヶ月前

VisualStudio2017Communityを使用しました。
プログラム

コード: 全て選択

using System;

namespace ConsoleApp0103
{
    delegate int MyDelegate(int x); // delegate 戻り値の型 デリゲート名(パラメータリスト);

    class ClassA
    {
        public int MethodA(int x) { return x * x; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassA objA = new ClassA();

            MyDelegate md = objA.MethodA;


            Console.WriteLine(md(3));


        }
    }

}
実行結果

コード: 全て選択

9
続行するには何かキーを押してください . . .
この例では、Mainメソッドのあるクラス外のインスタンスメソッドのアドレスobjA.MethodAを デリゲートmdに格納しました。

C言語やC++言語でいえば 「デリゲートとは関数ポインターや関数オブジェクトをオブジェクト指向に適するように拡張したもの」 です。

デリゲートは用途も関数ポインターとほとんど同じで、 述語やイベントハンドラ等に利用します。 ただし、C言語の関数ポインターと違い、 インスタンスメソッドを参照したり、 複数のメソッドを同時に参照する事が出来ます。

delegate(委譲)という言葉のニュアンスとしては、 「他のメソッドに処理を丸投げするためのオブジェクト」というような意味です。 イベントが起きたときのイベントハンドリングをどのメソッドに丸投げ(委託)するかを指示するためなどに使われます。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#6

投稿記事 by Math » 3ヶ月前

[参考] ラムダ式 (VisualStudio2017 Community)

コード: 全て選択

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int> md = x => x * x;
            Console.WriteLine(md(3));
        }
    }
}

コード: 全て選択

1>------ ビルド開始: プロジェクト: ConsoleApp1, 構成: Debug Any CPU ------
1>  ConsoleApp1 -> G:\zCS\001\01Cons\ConsoleApp0104\ConsoleApp1\bin\Debug\ConsoleApp1.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

コード: 全て選択

9
続行するには何かキーを押してください . . .

ISLe
記事: 2607
登録日時: 7年前
連絡を取る:

Re: 【Unity/C#】delegateが全然理解できません。

#7

投稿記事 by ISLe » 3ヶ月前

オフトピック
オブジェクト指向において、委譲(delegation)は基本的な要素のひとつで、古くからある考え方です。
それでも『デリゲート』という単語がメジャーになったのはjavascriptの影響が大きいと思います。
javascriptの実装は関数の属するコンテキストが云々といったかなりややこしい話になるけれど、結論だけ見れば「ただの関数に状態を持たせられる」というところが新しい。
「状態を持たせた関数がただの関数と同じく扱える」という表現のほうが適切か?

Math

Re: 【Unity/C#】delegateが全然理解できません。

#8

投稿記事 by Math » 3ヶ月前

C#におけるデリゲート(delegate-委任・委託・委譲という意味)とはその名前の通り、処理の委譲を支援するための仕組みとなります。
委譲とは大辞林によると「権限などを他に任せて譲ること」となっています。
委譲する場合にはきちんと「委譲することができる人」の「条件の定義」が必要となる訳です。

C#においても同じように考えることができて、デリゲートという仕組みでは、まずは処理を委譲することができる関数(メソッド)の条件を定義する必要があります。

そこで、C#のデリゲートでは、まずメソッドの参照を行うために利用する条件メソッド引数戻り値を定義することで設定します。 そして定義されたデリゲートはC#では「型」(厳密には参照型)として機能します。

それでは定義方法です。定義は「delegate」という予約語を用いて「メソッド」の「引数」や「戻り値」などを指定します。

前述のとおり、デリゲートは型として定義することになるので、定義したデリゲートを用いることで、メソッドを格納するための「変数宣言」を行うことができる訳ですね。

以下のサンプルでは「MyDelegate」という名前のデリゲートを定義しています。
ここではintの戻り値を持ち、int型の引数を持つデリゲートはこんな感じで定義します。

// デリゲートを定義
delegate int MyDelegate(int x); // delegate 戻り値の型 デリゲート名(パラメータリスト);

次に宣言したdelegateを用いて変数宣言を行って、それを利用する訳です。

デリゲートで変数宣言した変数には「メソッドそのもの」を代入することが可能です。
そして、代入した変数を用いてメソッドを呼び出すことが可能になります。

C# 2.0

基本的なデリゲートの機能的には1.0と大差ないのですが、デリゲートの代入時にインスタンス生成(new デリゲート名)を省略できるようになりました。

匿名メソッド・匿名関数(C# 2.0)

また、C# 2.0では匿名メソッド(anonymous method)・インラインメソッド(inline method)が追加されていました。
インラインメソッドとはdelegate構文を用いて「メソッド名を持たない処理」を記述する方法が提供されました。
// Delegate
public delegate int CalculateMethod(int x, int y);

static void Main(string[] args)
{
// 匿名デリゲート
CalculateMethod calc = delegate(int x, int y) { return x + y; };

Console.WriteLine(calc(10, 20));
}


delegateを用いて非常に簡単は処理を記述することに利用されていましたが、今では後述するラムダ式があるため、利用する機会は減りました。

(C# 3.0/.NET Framework 3.5)

C# 2.0や.NET Framework 2.0で導入したジェネリック(総称性)の機能を用いて、.NET Framework 3.5では以下の3種類のデリゲートが定義されました。

戻り値のない定義済みデリゲートのAction
•戻り値を持つ定義済みデリゲートのFunc
•論理型のも戻り値を持つ定義済みデリゲートのPredicate

具体的にどのように定義されているかというと

public delegate void Action()

public delegate void Action<in T>(T arg)

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2)

public delegate void Action<in T1, in T2, in T3>(T1 arg1, T2 arg2, T3 arg3)

public delegate void Action<in T1, in T2, in T3, in T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)

public delegate TResult Func<out TResult>()

public delegate TResult Func<in T, out TResult>(T arg)

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)

public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3)

public delegate TResult Action<in T1, in T2, in T3, in T4, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)

public delegate bool Predicate<T>(T arg)

というような感じで定義されています。

実は、.NET Framework 2.0で既にAction<T>(T arg)のみ定義されていましたが、その後3.0で、上記のように引数の数が4つあるジェネリックデリゲートまで定義されました。

最新の.NET Framework 4.5ではActionやFuncに指定される引数の数が最大16まであるデリゲートが定義されています。

そのため2.0までに行っていたように新しく「delegateキーワードを使ったデリゲート宣言」を行わなくてよくなり、多くのケースで定義済みのデリゲートを利用することで事足りるようになりました。
class Sample
{
public int Add(int x, int y)
{
return x + y;
}
public void Write(int s)
{
Console.WriteLine(s);
}
}

class Program
{
static void Main(string[] args)
{
Sample s = new Sample();

// 戻り値のないメソッドをActionデリゲートで
Action<int> write = s.Write;

// 戻り値がある関数はFuncデリゲートで
Func<int, int, int> calc1 = s.Add;

// 匿名関数を使って宣言
Func<int, int, int> calc2 = delegate(int x, int y) { return x - y; };

write(calc1(10, 20));
write(calc2(10, 20));
}
}

C# 3.0

ラムダ式は簡単に言ってしまうと「デリゲート型」および「式ツリー(ExpressionTree)」を作成するために使用できる匿名関数です。

主にLINQで用いることができるよう追加された仕様ですが、もちろんそれ以外の用途でも利用できます。

ラムダ式を作成するにはラムダ演算子( => ) を用いて左辺にパラメータ、右辺に式やステートメントブロックを置くことで作成できます。
// =>の左側がパラメータ、右側が式
Func<int, int> fuctorial = x => x*x;

// パラメータが複数ある場合は()の中に指定する
Func<int, int, int> calc2 = (x, y) => x + y;

// 複数のステートメントになる場合はステートメントブロックを使って、
// メソッドと同様return文で戻り値を指定する。
Func<int, int, int> calc3 = (x, y) =>
{
int result = x - y;
return result;
};


上記のようにラムダ式には式形式のものとステートメント形式のものがあります。

また、匿名関数といっても、前述した匿名関数とは見た目以外にもいくつかの違いがあります。
•ラムダ式の戻り値はデリゲート以外にも式ツリー(Expressionクラスを用いたツリー)も作成が可能。ただし、ラムダ式内でメソッド呼出などを行うと式ツリーの作成ができない。
•匿名関数は、インラインで記述できるがメソッドなので、ステートメントブロックの中から定義されているメソッド内の変数にはアクセスできませんが、ラムダ式では「変数のキャプチャ」という機能により下記のサンプルのように上位スコープの変数のアクセスが行える。

Action<string> GetWriteAction(strings)

{

string text =string.Format(“[{0}]”);



// 上位スコープのtextをキャプチャ

return p =>Console.WriteLine(“{0}:{1}“, p, text);

}

ただし、上記のサンプルのように変数をキャプチャした状態で外部メソッドをデリゲートを引き継ぐと、通常メソッド終了時に変数の解放がされるところ、生存期間が長くなることがありますので注意が必要です。

C#

ほとんどのケースで必要なし(定義済みデリゲートを利用)

現在のC#での利用
Func<int, int, int> add = (x, y) => x + y;
Func<int, int, int> sub = (x, y) =>
{
int result = x - y;
return result;
};

このようにかなり簡潔に記述できるようになりました。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#9

投稿記事 by Math » 3ヶ月前

[参考]C# C++ のいずれも、パラメーター化された型のサポートを提供する言語機能です。 ただし、これら 2 つにはさまざまな違いがあります。 構文レベルでは、C# ジェネリックの場合、パラメーター化された型の取り扱いが単純であり、C++ テンプレートのような複雑さがありません。 さらに、C++ テンプレートで提供されるすべての機能が、C# でも提供されるわけではありません。 実装レベルでは、C# ジェネリック型の代入は実行時に行われ、その結果、インスタンス化されたオブジェクトのジェネリック型情報が保存されるという点が最も大きな違いです。 詳細については、「ランタイムのジェネリック」を参照してください。

C# ジェネリックと C++ テンプレートの主な違いを以下に示します。

•C# ジェネリックは、C++ テンプレートほど柔軟ではありません。 たとえば、C# ジェネリック クラスでは、ユーザー定義演算子は呼び出すことができますが、算術演算子を呼び出すことはできません。


•C# では、template C<int i> {} などの非型テンプレート パラメーターを使用できません。


•C# は、明示的な特殊化 (特定の型のテンプレートのカスタム実装) をサポートしません。


•C# は、部分的な特殊化 (型引数のサブセットのカスタム実装) をサポートしません。


•C# では、型パラメーターをジェネリック型の基底クラスとして使用できません。


•C# では、型パラメーターに既定の型を割り当てることができません。


•C# では、構築された型はジェネリックとして使用できますが、ジェネリック型パラメーター自体はジェネリックにできません。 C++ では、テンプレート パラメーターを使用できます。


•C++ では、テンプレート内のすべての型パラメーターに対して有効でない可能性のあるコードを使用できます。このようなコードは、型パラメーターとして使用されている特定の型に対してチェックされます。 C# では、制約を満たすすべての型で正常に動作するようにクラスのコードを記述する必要があります。 たとえば、C++ では、型パラメーターのオブジェクトで算術演算子 + および - を使用し、これらの演算子をサポートしない型を使ってテンプレートをインスタンス化するとエラーを生成する関数を記述できます。 C# では、このような関数は許可されません。許可される言語構成要素は、制約から推定できるものだけに限られます。

C# ジェネリックと C++ テンプレートのいずれも、パラメーター化された型のサポートを提供する言語機能です。 ただし、これら 2 つにはさまざまな違いがあります。 構文レベルでは、C# ジェネリックの場合、パラメーター化された型の取り扱いが単純であり、C++ テンプレートのような複雑さがありません。 さらに、C++ テンプレートで提供されるすべての機能が、C# でも提供されるわけではありません。 実装レベルでは、C# ジェネリック型の代入は実行時に行われ、その結果、インスタンス化されたオブジェクトのジェネリック型情報が保存されるという点が最も大きな違いです。 詳細については、「ランタイムのジェネリック」を参照してください。

C# ジェネリックと C++ テンプレートの主な違いを以下に示します。

•C# ジェネリックは、C++ テンプレートほど柔軟ではありません。 たとえば、C# ジェネリック クラスでは、ユーザー定義演算子は呼び出すことができますが、算術演算子を呼び出すことはできません。


•C# では、template C<int i> {} などの非型テンプレート パラメーターを使用できません。


•C# は、明示的な特殊化 (特定の型のテンプレートのカスタム実装) をサポートしません。


•C# は、部分的な特殊化 (型引数のサブセットのカスタム実装) をサポートしません。


•C# では、型パラメーターをジェネリック型の基底クラスとして使用できません。


•C# では、型パラメーターに既定の型を割り当てることができません。


•C# では、構築された型はジェネリックとして使用できますが、ジェネリック型パラメーター自体はジェネリックにできません。 C++ では、テンプレート パラメーターを使用できます。


•C++ では、テンプレート内のすべての型パラメーターに対して有効でない可能性のあるコードを使用できます。このようなコードは、型パラメーターとして使用されている特定の型に対してチェックされます。 C# では、制約を満たすすべての型で正常に動作するようにクラスのコードを記述する必要があります。 たとえば、C++ では、型パラメーターのオブジェクトで算術演算子 + および - を使用し、これらの演算子をサポートしない型を使ってテンプレートをインスタンス化するとエラーを生成する関数を記述できます。 C# では、このような関数は許可されません。許可される言語構成要素は、制約から推定できるものだけに限られます。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#10

投稿記事 by Math » 3ヶ月前

Unityの例もありましたよ。

コード: 全て選択

using UnityEngine; 
using System.Collections; 

public class Main : MonoBehaviour 

    public delegate void HogeDelegate(string a); // delegate 型の
    HogeDelegate h;                                         // delegate 型の変数を宣言 

    void Start () {
        h = (a) => {Debug.Log(a);}; // メソッドを代入 
        h += A;                            // メソッド A を追加 
        h("nullpo");                   // 実行 
        Debug.Log ("---"); 
        h -= A;                     // メソッド A を削除 
        h("ga!");                 // もう一度実行 
    } 
    void A(string a) { 
        Debug.Log ("a:" + a); 
    } 
} 
https://loumo.jp/wp/archive/20131104215947/

Math

Re: 【Unity/C#】delegateが全然理解できません。

#11

投稿記事 by Math » 3ヶ月前

Unity - チュートリアル 「デリゲート」 (動画あります。)

コード: 全て選択

using UnityEngine;
using System.Collections;


public class DelegateScript : MonoBehaviour 
{   
    delegate void MyDelegate(int num);
    MyDelegate myDelegate;
    

    void Start () 
    {
        myDelegate = PrintNum;
        myDelegate(50);
        
        myDelegate = DoubleNum;
        myDelegate(50);
    }
    
    void PrintNum(int num)
    {
        print ("Print Num: " + num);
    }
    
    void DoubleNum(int num)
    {
        print ("Double Num: " + num * 2);
    }
}
https://unity3d.com/jp/learn/tutorials/ ... /delegates


Math

Re: 【Unity/C#】delegateが全然理解できません。

#13

投稿記事 by Math » 3ヶ月前

私が業務でC#を使った開発を行っていたころはVisualStudioを使ってグループで行っていたのですが。いまHPでC#のPowerSell_ISEを使ってVisualStudioを使わずWindows10のみで可能なC#の解説をしています。ここで何度か使用したこともありますが簡単にC#の資料がUnix Shellのような命令で得られるしBuild、実行が自動化出来るのでVisualStudioのような複雑な内容でなく全てが理解できる範囲で解説できるからです。
(VisualStudioは重いからVS2008まででVS2015/2017は使いたくなかったのですがUnityをいれたら一緒に入ってしまった)
現在HPを移転する作業中ですがDelegateに関しても記述してあります。

だいぶ以前にDelegateの質問があったときに答えで上記の内容は記述したはずです。
私が参考にするページで一番信頼性がありわかりやすいのは C# によるプログラミング入門(++C++ 未確認飛行 )
http://ufcpp.net/study/csharp/さんです。

業務から入門までC#関するDesktop開発全ては 
https://dobon.net/さん

他はMSDN,Microsoftの資料
https://docs.microsoft.com/ja-jp/dotnet ... p-generics

Delegateで検索してすぐ出るページ(Ok google を使うと便利)
http://moriblog.kit-eng.com/?p=975

Math

Re: 【Unity/C#】delegateが全然理解できません。

#14

投稿記事 by Math » 3ヶ月前

>多重継承といえば、昔Borland C++についてたC++クラスライブラリがあったなー
>登場からもう30年近くにもなるのかー。
>今もC++ Builderなどで使えたりするぽい

私は今C++ Builderを使っています。(^^;

C#を開発したのはアンダース・ヘルスバーグで 昔Borland にいて Microsoftと競合していた!
https://ja.wikipedia.org/wiki/%E3%82%A2 ... C%E3%82%B0

Math

Re: 【Unity/C#】delegateが全然理解できません。

#15

投稿記事 by Math » 3ヶ月前

[雑談]
Visual Basic 2015は2015年に.NET Framework 4.6とともに公開された。Roslynと呼ばれるコンパイラレイヤーにより、Visual C#と同等のIDE機能を備えるに至った。
(C#の開発責任者がVBも兼任し約2000万行を使って開発したときいている。)

Math

Re: 【Unity/C#】delegateが全然理解できません。

#16

投稿記事 by Math » 3ヶ月前

[雑談]
>私は今C++ Builderを使っています。

C++ Builderは DXライブラリの設定が一番楽だった。
http://dxlib.o.oo7.jp/use/dxuse_cpp_builder.html

Math

Re: 【Unity/C#】delegateが全然理解できません。

#17

投稿記事 by Math » 3ヶ月前

ここにC#2.0以前のデリゲートの使い方がありますよ。
http://www.kumei.ne.jp/c_lang/cs/cs_45.htm

よもやま
記事: 43
登録日時: 2年前
連絡を取る:

Re: 【Unity/C#】delegateが全然理解できません。

#18

投稿記事 by よもやま » 3ヶ月前

Math さんが書きました:>多重継承といえば、昔Borland C++についてたC++クラスライブラリがあったなー
>登場からもう30年近くにもなるのかー。
>今もC++ Builderなどで使えたりするぽい

私は今C++ Builderを使っています。(^^;

C#を開発したのはアンダース・ヘルスバーグで 昔Borland にいて Microsoftと競合していた!
https://ja.wikipedia.org/wiki/%E3%82%A2 ... C%E3%82%B0
昨年大掃除していたら昔購入したBorlandC++のOWLに関する分厚いマニュアルがでてきたよ(^^;;
最近はC#が主で使っているけれど、なつかしさのあまりマニュアルを読みふけって掃除が進まなかった(^^;;

Math

Re: 【Unity/C#】delegateが全然理解できません。

#19

投稿記事 by Math » 3ヶ月前

>最近はC#が主で使っているけれど、なつかしさのあまりマニュアルを読みふけって掃除が進まなかった(^^;;
C#は基本的にDelphiに似てるらしいのでBorlandC++のOWLにも似たところがあるでしょうね。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#20

投稿記事 by Math » 3ヶ月前

C#は開発にはボーランド社のTurbo PascalやDelphiを開発したアンダース・ヘルスバーグを筆頭に多数のDelphi開発陣が参加している。
https://ja.wikipedia.org/wiki/C_Sharp

Math

Re: 【Unity/C#】delegateが全然理解できません。

#21

投稿記事 by Math » 3ヶ月前

Windows10のみでC#のラムダ式の例を実行した例です。
PowerShell ISEを使用しました。
http://www2.koyoen.birdview.co.jp/~abcxyz/1.jpg
実行
http://www2.koyoen.birdview.co.jp/~abcxyz/2.jpg

Math

Re: 【Unity/C#】delegateが全然理解できません。

#22

投稿記事 by Math » 3ヶ月前

C#のコードは

コード: 全て選択

using System;
using System.Windows.Forms;
using System.Drawing;
public class Program
{
    [STAThread]
    static void Main()
    {
        Form f;
        Button b;
        TextBox t;
        f = new Form();
        b = new Button();
        t = new TextBox();
        f.Text = "Form";
        t.Text = "TextBox: ABCDE";
        b.Text = "Button";
        f.Size = new Size(300, 200);
        f.Location = new Point(500, 400);
        t.Location = new Point(30, 20);
        b.Location = new Point(30, 60);
        f.Controls.Add(b);
        f.Controls.Add(t);
        b.Click += (sender, e) => { t.Text = "C# ボタン: Hello!";
                                    MessageBox.Show("AAA"); };
        Application.Run(f);
    }
}
b.Click += (sender, e) => { t.Text = "C# ボタン: Hello!";
MessageBox.Show("AAA"); };
の部分がラムダ式です。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#23

投稿記事 by Math » 3ヶ月前

C#のコードは

コード: 全て選択

using System;
using System.Windows.Forms;
using System.Drawing;
public class Program
{
    [STAThread]
    static void Main()
    {
        Form f;
        Button b;
        TextBox t;
        f = new Form();
        b = new Button();
        t = new TextBox();
        f.Text = "Form";
        t.Text = "TextBox: ABCDE";
        b.Text = "Button";
        f.Size = new Size(300, 200);
        f.Location = new Point(500, 400);
        t.Location = new Point(30, 20);
        b.Location = new Point(30, 60);
        f.Controls.Add(b);
        f.Controls.Add(t);
        b.Click += (sender, e) => { t.Text = "C# ボタン: Hello!";
                                    MessageBox.Show("AAA"); };
        Application.Run(f);
    }
}
b.Click += (sender, e) => { t.Text = "C# ボタン: Hello!";
MessageBox.Show("AAA"); };
の部分がラムダ式です。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#24

投稿記事 by Math » 3ヶ月前

コマンド プロンプト の 新しいタイプの PowerShellで書いたスクリプトで C# を使ってプログラミング を実行します。
Window10 のみがあれば 大丈夫です。 他には何も入りません。
Window に付属 している C# コンパイラ( csc.exe ) とPowerShell ISE を使います。
Unix互換のShell命令がつかえます。lsはリスト,sal はエイリアスの設定です。
PowerShell スクリプト(ps1.ps1)は

コード: 全て選択


ls C:\windows\Microsoft.NET\Framework64\*.*

ls C:\windows\Microsoft.NET\Framework64\v4.0.30319\c*.*

sal csc C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe

csc ./cs1.cs

ls

.\cs1.exe

exit

結果は

コード: 全て選択

PS G:\CX\001\0110> G:\CX\001\0110\ps1.ps1


    ディレクトリ: C:\windows\Microsoft.NET\Framework64


Mode                LastWriteTime         Length Name                               
----                -------------         ------ ----                               
d-----       2018/01/08      9:57                v2.0.50727                         
d-----       2017/12/10     12:47                v3.0                               
d-----       2017/12/10     12:47                v3.5                               
d-----       2018/01/10     10:02                v4.0.30319                         
-a----       2017/09/29     22:41           8704 sbscmp10.dll                       
-a----       2017/09/29     22:41           8704 sbscmp20_mscorwks.dll              
-a----       2017/09/29     22:41           8704 sbscmp20_perfcounter.dll           
-a----       2017/09/29     22:41           8704 SharedReg12.dll                    


    ディレクトリ: C:\windows\Microsoft.NET\Framework64\v4.0.30319


Mode                LastWriteTime         Length Name                               
----                -------------         ------ ----                               
-a----       2017/09/29     22:43         107128 CasPol.exe                         
-a----       2017/09/29     22:44            368 caspol.exe.config                  
-a----       2017/09/29     22:41          35794 clientexclusionlist.xml            
-a----       2017/09/29     22:43         321131 CLR-ETW.man                        
-a----       2017/12/10     12:59       10358904 clr.dll                            
-a----       2017/09/29     22:43         140480 clrcompression.dll                 
-a----       2017/09/29     22:43         237728 clretwrc.dll                       
-a----       2017/12/10     12:58        1208456 clrjit.dll                         
-a----       2017/12/10     12:59        1259664 compatjit.dll                      
-a----       2017/09/29     22:43         173688 ComSvcConfig.exe                   
-a----       2017/09/29     22:43         156344 CORPerfMonExt.dll                  
-a----       2017/09/29     22:43        2738296 csc.exe                            
-a----       2017/09/29     22:43            182 csc.exe.config                     
-a----       2017/09/29     22:43           1329 csc.rsp                            
-a----       2017/09/29     22:43          64160 Culture.dll                        
-a----       2017/09/29     22:43         105672 CustomMarshalers.dll               
-a----       2017/09/29     22:43          47280 cvtres.exe                         
-a----       2017/09/29     22:43            281 cvtres.exe.config                  
Microsoft (R) Visual C# Compiler version 4.7.2556.0

for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.



This compiler is provided as part of the Microsoft (R) .NET Framework, but only suppo
rts language versions up to C# 5, which is no longer the latest version. For compiler
s that support newer versions of the C# programming language, see http://go.microsoft
.com/fwlink/?LinkID=533240



    ディレクトリ: G:\CX\001\0110


Mode                LastWriteTime         Length Name                               
----                -------------         ------ ----                               
-a----       2018/01/10     21:01             28 p.bat                              
-a----       2018/01/10     23:49            216 ps1.ps1                            
-a----       2018/01/10     23:45            757 cs1.cs                             
-a----       2018/01/10     23:49           4608 cs1.exe                            
-a----       2018/01/10     23:46            980 ps1---001.ps1                      



PS G:\CX\001\0110> 
となります。

Math

Re: 【Unity/C#】delegateが全然理解できません。

#25

投稿記事 by Math » 3ヶ月前

従来のコマンドプロンプトからコンパイル&実行するにはバッチ・ファイルをつくります。
cs.bat

コード: 全て選択

DIR

C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe cs1.cs

.\cs1.exe
実行はcs.batをダブルクリックするだけです。
http://www2.koyoen.birdview.co.jp/~abcxyz/7.jpg

http://www2.koyoen.birdview.co.jp/~abcxyz/8.jpg

Math

Re: 【Unity/C#】delegateが全然理解できません。

#26

投稿記事 by Math » 3ヶ月前

Windows10にはMSBuild.exeも付属しているのでプロジェクトファイルをメモ帳で書けばWPF(xaml使用)のビルドもできる。(私のHPには沢山のサンプルがのせてあった。移転の為削除した。)
http://www2.koyoen.birdview.co.jp/~abcxyz/9.jpg

また
「csc.rsp」(応答ファイル)
csc.exe と同じ フォルダにある csc.rsp というファイルがあって.NET Framework アセンブリ(DLL)
を自動的に参照してくれます。
http://www2.koyoen.birdview.co.jp/~abcxyz/a.jpg
---------------------------------------------------------------
# Reference the common Framework libraries
/r:Accessibility.dll
/r:Microsoft.CSharp.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Core.dll
/r:System.Data.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Data.Linq.dll
/r:System.Data.OracleClient.dll
/r:System.Deployment.dll
/r:System.Design.dll
/r:System.DirectoryServices.dll
/r:System.dll
/r:System.Drawing.Design.dll
/r:System.Drawing.dll
/r:System.EnterpriseServices.dll
/r:System.Management.dll
/r:System.Messaging.dll
/r:System.Runtime.Remoting.dll
/r:System.Runtime.Serialization.dll
/r:System.Runtime.Serialization.Formatters.Soap.dll
/r:System.Security.dll
/r:System.ServiceModel.dll
/r:System.ServiceModel.Web.dll
/r:System.ServiceProcess.dll
/r:System.Transactions.dll
/r:System.Web.dll
/r:System.Web.Extensions.Design.dll
/r:System.Web.Extensions.dll
/r:System.Web.Mobile.dll
/r:System.Web.RegularExpressions.dll
/r:System.Web.Services.dll
/r:System.Windows.Forms.Dll
/r:System.Workflow.Activities.dll
/r:System.Workflow.ComponentModel.dll
/r:System.Workflow.Runtime.dll
/r:System.Xml.dll
/r:System.Xml.Linq.dll
-------------------------------------------------------------------------

サンプル
cs1.cs

コード: 全て選択

using System;
using System.Windows.Forms;
namespace HelloWorld
{
    class Hello 
    {
        static void Main()
        {
	    Console.WriteLine("Hello World!");
            MessageBox.Show("Hello World!");
        }
    }
}
http://www2.koyoen.birdview.co.jp/~abcxyz/b.jpg

Math

Re: 【Unity/C#】delegateが全然理解できません。

#27

投稿記事 by Math » 3ヶ月前

従来のコマンドプロンプトからコンパイル&実行するにはバッチ・ファイルをつくります。
cs.bat

コード: 全て選択


DIR

TYPE cs1.cs
 
C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe cs1.cs

DIR

.\cs1.exe
http://www2.koyoen.birdview.co.jp/~abcxyz/d.jpg

コード: 全て選択


G:\CX\001\0112>DIR
 ドライブ G のボリューム ラベルがありません。
 ボリューム シリアル番号は 9016-4EF8 です

 G:\CX\001\0112 のディレクトリ

2018/01/12  06:05    <DIR>          .
2018/01/12  06:05    <DIR>          ..
2018/01/10  21:01                28 p.bat
2018/01/12  08:41               101 ps1.ps1
2018/01/12  08:43               241 cs1.cs
2018/01/12  20:53               109 cs.bat
2018/01/12  21:00             3,584 cs1.exe
               5 個のファイル               4,063 バイト
               2 個のディレクトリ   4,576,837,632 バイトの空き領域

G:\CX\001\0112>TYPE cs1.cs
using System;
using System.Windows.Forms;
namespace HelloWorld
{
    class Hello
    {
        static void Main()
        {
            Console.WriteLine("Hello World!");
            MessageBox.Show("Hello World!");
        }
    }
}

G:\CX\001\0112>C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe cs1.cs
Microsoft (R) Visual C# Compiler version 4.7.2556.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240


G:\CX\001\0112>DIR
 ドライブ G のボリューム ラベルがありません。
 ボリューム シリアル番号は 9016-4EF8 です

 G:\CX\001\0112 のディレクトリ

2018/01/12  06:05    <DIR>          .
2018/01/12  06:05    <DIR>          ..
2018/01/10  21:01                28 p.bat
2018/01/12  08:41               101 ps1.ps1
2018/01/12  08:43               241 cs1.cs
2018/01/12  20:53               109 cs.bat
2018/01/12  21:01             3,584 cs1.exe
               5 個のファイル               4,063 バイト
               2 個のディレクトリ   4,576,837,632 バイトの空き領域

G:\CX\001\0112>.\cs1.exe
Hello World!

Math

Re: 【Unity/C#】delegateが全然理解できません。

#28

投稿記事 by Math » 3ヶ月前

PowerShell プログラム

コード: 全て選択

$form = New-Object System.Windows.Forms.Form 
$form.ShowDialog()
この2行でFormが表示できます。
http://www2.koyoen.birdview.co.jp/~abcxyz/e.jpg

VisualStudioのように入力補完が出来ます。
http://www2.koyoen.birdview.co.jp/~abcxyz/f.jpg

Math

Re: 【Unity/C#】delegateが全然理解できません。

#29

投稿記事 by Math » 3ヶ月前

C#では
cs.bat

コード: 全て選択

DIR

C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe cs1.cs

.\cs1.exe

cs1.cs

コード: 全て選択

using System;
using System.Windows.Forms;

public class Program
{
    [STAThread]
    static void Main()
    {
        Form f;
        f=new Form();
        f.ShowDialog();
    }

}
http://www2.koyoen.birdview.co.jp/~abcxyz/h.jpg

Math

Re: 【Unity/C#】delegateが全然理解できません。

#30

投稿記事 by Math » 3ヶ月前

C#と同様なPowerShell プログラムの例。VisualStudioのように入力補完が出来ます。

コード: 全て選択

<#
using System;
using System.Windows.Forms;
using System.Drawing;
public class Program
{
    [STAThread]
    static void Main()
    {
        Form f;
        Button b;
        TextBox t;
        f = new Form();
        b = new Button();
        t = new TextBox();
        f.Text = "Form";
        t.Text = "TextBox: ABCDE";
        b.Text = "Button";
        f.Size = new Size(300, 200);
        f.Location = new Point(500, 400);
        t.Location = new Point(30, 20);
        b.Location = new Point(30, 60);
        f.Controls.Add(b);
        f.Controls.Add(t);
        b.Click += (sender, e) => { t.Text = "C# ボタン: Hello!";
                                    MessageBox.Show("AAA"); };
        Application.Run(f);
    }
}
#>

$f = New-Object System.Windows.Forms.Form 
$b = New-Object System.Windows.Forms.Button
$t = New-Object System.Windows.Forms.TextBox
$f.Text = "Form"
$t.Text = "TextBox:ABCDE"
$b.Text = "Button"
$f.Size = New-Object System.Drawing.Size(300,200) 
$f.Location = New-Object System.Drawing.Point(500, 400);
$t.Location = New-Object System.Drawing.Point(30, 20);
$b.Location = New-Object System.Drawing.Point(30, 60);
$f.Controls.Add($b);
$f.Controls.Add($t);
$b_Click = { [System.Windows.Forms.MessageBox]::Show("P.shell ボタン: Hello!:AAA") }
$b.Add_Click($b_Click)
$f.ShowDialog()
http://www2.koyoen.birdview.co.jp/~abcxyz/j.jpg

http://www2.koyoen.birdview.co.jp/~abcxyz/i.jpg

返信

“C言語何でも質問掲示板” へ戻る