【Unity/C#】delegateが全然理解できません。
【Unity/C#】delegateが全然理解できません。
件名の通りです。
デリゲートの書き方がチンプンカンプンです。
メソッドを委譲したい時に使うもの、ということは分かるのですが...
ネット上のサンプルコードも幾つか見ましたが、どの部分がデリゲートの核たる部分なのか分かりませんorz
デリゲートを使った最も簡単なサンプルコードを、どなたか書いて頂けないでしょうか。
デリゲートの書き方がチンプンカンプンです。
メソッドを委譲したい時に使うもの、ということは分かるのですが...
ネット上のサンプルコードも幾つか見ましたが、どの部分がデリゲートの核たる部分なのか分かりませんorz
デリゲートを使った最も簡単なサンプルコードを、どなたか書いて頂けないでしょうか。
Re: 【Unity/C#】delegateが全然理解できません。
フォーラムルールを一読してやって下さい。
[フォーラムルールより]
以下のテンプレをコピペして、
各項目に対して答える形で記載して下さい。
[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の頃の説明を読むと良くわかるはずです。(私のホームページに 初歩の例を沢山書いていたたのですが最近引越しの為削除してしました。(><)
[フォーラムルールより]
以下のテンプレをコピペして、
各項目に対して答える形で記載して下さい。
[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の頃の説明を読むと良くわかるはずです。(私のホームページに 初歩の例を沢山書いていたたのですが最近引越しの為削除してしました。(><)
Re: 【Unity/C#】delegateが全然理解できません。
デリゲートより前は、間接的にメソッドを呼び出す方法として使えたのは
1. 静的なメソッド(クラスメソッド)の参照を経由する
2. 特定のメソッドを持つ特定のクラス(あるいはインターフェース)にアップキャスト可能なインスタンスを経由する
という方法だけでした。
1. はメソッド単体で使うので、状態を持つことができません。
状態を扱うには引数でインスタンスを与えるといったオブジェクト指向らしからぬ手段を用いる必要があります。
2. は状態を持たせられますが、継承が必須となり、多重継承の問題を抱えることになります。
そこで、メソッドのシグネチャのみを対象とし、メソッドが何に属しているかを不問とする方法ができました。
それが、一般的にデリゲートと呼ばれる仕組みです。
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(); // 呼び出し
}
}
Re: 【Unity/C#】delegateが全然理解できません。
オフトピック
多重継承といえば、昔Borland C++についてたC++クラスライブラリがあったなー
登場からもう30年近くにもなるのかー。
今もC++ Builderなどで使えたりするぽい。
Object Windows Library
登場からもう30年近くにもなるのかー。
今もC++ Builderなどで使えたりするぽい。
Object Windows Library
Re: 【Unity/C#】delegateが全然理解できません。
VisualStudio2017Communityを使用しました。
プログラム
実行結果
この例では、Mainメソッドのあるクラス外のインスタンスメソッドのアドレスobjA.MethodAを デリゲートmdに格納しました。
C言語やC++言語でいえば 「デリゲートとは関数ポインターや関数オブジェクトをオブジェクト指向に適するように拡張したもの」 です。
デリゲートは用途も関数ポインターとほとんど同じで、 述語やイベントハンドラ等に利用します。 ただし、C言語の関数ポインターと違い、 インスタンスメソッドを参照したり、 複数のメソッドを同時に参照する事が出来ます。
delegate(委譲)という言葉のニュアンスとしては、 「他のメソッドに処理を丸投げするためのオブジェクト」というような意味です。 イベントが起きたときのイベントハンドリングをどのメソッドに丸投げ(委託)するかを指示するためなどに使われます。
プログラム
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));
}
}
}
C言語やC++言語でいえば 「デリゲートとは関数ポインターや関数オブジェクトをオブジェクト指向に適するように拡張したもの」 です。
デリゲートは用途も関数ポインターとほとんど同じで、 述語やイベントハンドラ等に利用します。 ただし、C言語の関数ポインターと違い、 インスタンスメソッドを参照したり、 複数のメソッドを同時に参照する事が出来ます。
delegate(委譲)という言葉のニュアンスとしては、 「他のメソッドに処理を丸投げするためのオブジェクト」というような意味です。 イベントが起きたときのイベントハンドリングをどのメソッドに丸投げ(委託)するかを指示するためなどに使われます。
Re: 【Unity/C#】delegateが全然理解できません。
[参考] ラムダ式 (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 スキップ ==========
Re: 【Unity/C#】delegateが全然理解できません。
オフトピック
オブジェクト指向において、委譲(delegation)は基本的な要素のひとつで、古くからある考え方です。
それでも『デリゲート』という単語がメジャーになったのはjavascriptの影響が大きいと思います。
javascriptの実装は関数の属するコンテキストが云々といったかなりややこしい話になるけれど、結論だけ見れば「ただの関数に状態を持たせられる」というところが新しい。
「状態を持たせた関数がただの関数と同じく扱える」という表現のほうが適切か?
それでも『デリゲート』という単語がメジャーになったのはjavascriptの影響が大きいと思います。
javascriptの実装は関数の属するコンテキストが云々といったかなりややこしい話になるけれど、結論だけ見れば「ただの関数に状態を持たせられる」というところが新しい。
「状態を持たせた関数がただの関数と同じく扱える」という表現のほうが適切か?
Re: 【Unity/C#】delegateが全然理解できません。
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;
};
このようにかなり簡潔に記述できるようになりました。
委譲とは大辞林によると「権限などを他に任せて譲ること」となっています。
委譲する場合にはきちんと「委譲することができる人」の「条件の定義」が必要となる訳です。
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;
};
このようにかなり簡潔に記述できるようになりました。
Re: 【Unity/C#】delegateが全然理解できません。
[参考]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# では、このような関数は許可されません。許可される言語構成要素は、制約から推定できるものだけに限られます。
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# では、このような関数は許可されません。許可される言語構成要素は、制約から推定できるものだけに限られます。
Re: 【Unity/C#】delegateが全然理解できません。
Unityの例もありましたよ。
https://loumo.jp/wp/archive/20131104215947/
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);
}
}
Re: 【Unity/C#】delegateが全然理解できません。
Unity - チュートリアル 「デリゲート」 (動画あります。)
https://unity3d.com/jp/learn/tutorials/ ... /delegates
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);
}
}
Re: 【Unity/C#】delegateが全然理解できません。
オフトピック
無断転載元はこちら
No.8 → http://moriblog.kit-eng.com/?p=975
No.9 → https://docs.microsoft.com/ja-jp/dotnet ... p-generics
No.8 → http://moriblog.kit-eng.com/?p=975
No.9 → https://docs.microsoft.com/ja-jp/dotnet ... p-generics
Re: 【Unity/C#】delegateが全然理解できません。
私が業務で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
(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
Re: 【Unity/C#】delegateが全然理解できません。
>多重継承といえば、昔Borland C++についてたC++クラスライブラリがあったなー
>登場からもう30年近くにもなるのかー。
>今もC++ Builderなどで使えたりするぽい
私は今C++ Builderを使っています。(^^;
C#を開発したのはアンダース・ヘルスバーグで 昔Borland にいて Microsoftと競合していた!
https://ja.wikipedia.org/wiki/%E3%82%A2 ... C%E3%82%B0
>登場からもう30年近くにもなるのかー。
>今もC++ Builderなどで使えたりするぽい
私は今C++ Builderを使っています。(^^;
C#を開発したのはアンダース・ヘルスバーグで 昔Borland にいて Microsoftと競合していた!
https://ja.wikipedia.org/wiki/%E3%82%A2 ... C%E3%82%B0
Re: 【Unity/C#】delegateが全然理解できません。
[雑談]
Visual Basic 2015は2015年に.NET Framework 4.6とともに公開された。Roslynと呼ばれるコンパイラレイヤーにより、Visual C#と同等のIDE機能を備えるに至った。
(C#の開発責任者がVBも兼任し約2000万行を使って開発したときいている。)
Visual Basic 2015は2015年に.NET Framework 4.6とともに公開された。Roslynと呼ばれるコンパイラレイヤーにより、Visual C#と同等のIDE機能を備えるに至った。
(C#の開発責任者がVBも兼任し約2000万行を使って開発したときいている。)
Re: 【Unity/C#】delegateが全然理解できません。
[雑談]
>私は今C++ Builderを使っています。
C++ Builderは DXライブラリの設定が一番楽だった。
http://dxlib.o.oo7.jp/use/dxuse_cpp_builder.html
>私は今C++ Builderを使っています。
C++ Builderは DXライブラリの設定が一番楽だった。
http://dxlib.o.oo7.jp/use/dxuse_cpp_builder.html
Re: 【Unity/C#】delegateが全然理解できません。
ここにC#2.0以前のデリゲートの使い方がありますよ。
http://www.kumei.ne.jp/c_lang/cs/cs_45.htm
http://www.kumei.ne.jp/c_lang/cs/cs_45.htm
Re: 【Unity/C#】delegateが全然理解できません。
昨年大掃除していたら昔購入したBorlandC++のOWLに関する分厚いマニュアルがでてきたよ(^^;;Math さんが書きました:>多重継承といえば、昔Borland C++についてたC++クラスライブラリがあったなー
>登場からもう30年近くにもなるのかー。
>今もC++ Builderなどで使えたりするぽい
私は今C++ Builderを使っています。(^^;
C#を開発したのはアンダース・ヘルスバーグで 昔Borland にいて Microsoftと競合していた!
https://ja.wikipedia.org/wiki/%E3%82%A2 ... C%E3%82%B0
最近はC#が主で使っているけれど、なつかしさのあまりマニュアルを読みふけって掃除が進まなかった(^^;;
Re: 【Unity/C#】delegateが全然理解できません。
>最近はC#が主で使っているけれど、なつかしさのあまりマニュアルを読みふけって掃除が進まなかった(^^;;
C#は基本的にDelphiに似てるらしいのでBorlandC++のOWLにも似たところがあるでしょうね。
C#は基本的にDelphiに似てるらしいのでBorlandC++のOWLにも似たところがあるでしょうね。
Re: 【Unity/C#】delegateが全然理解できません。
C#は開発にはボーランド社のTurbo PascalやDelphiを開発したアンダース・ヘルスバーグを筆頭に多数のDelphi開発陣が参加している。
https://ja.wikipedia.org/wiki/C_Sharp
https://ja.wikipedia.org/wiki/C_Sharp
Re: 【Unity/C#】delegateが全然理解できません。
Windows10のみでC#のラムダ式の例を実行した例です。
PowerShell ISEを使用しました。
http://www2.koyoen.birdview.co.jp/~abcxyz/1.jpg
実行
http://www2.koyoen.birdview.co.jp/~abcxyz/2.jpg
PowerShell ISEを使用しました。
http://www2.koyoen.birdview.co.jp/~abcxyz/1.jpg
実行
http://www2.koyoen.birdview.co.jp/~abcxyz/2.jpg
Re: 【Unity/C#】delegateが全然理解できません。
C#のコードは
b.Click += (sender, e) => { t.Text = "C# ボタン: Hello!";
MessageBox.Show("AAA"); };
の部分がラムダ式です。
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);
}
}
MessageBox.Show("AAA"); };
の部分がラムダ式です。
Re: 【Unity/C#】delegateが全然理解できません。
C#のコードは
b.Click += (sender, e) => { t.Text = "C# ボタン: Hello!";
MessageBox.Show("AAA"); };
の部分がラムダ式です。
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);
}
}
MessageBox.Show("AAA"); };
の部分がラムダ式です。
Re: 【Unity/C#】delegateが全然理解できません。
コマンド プロンプト の 新しいタイプの PowerShellで書いたスクリプトで C# を使ってプログラミング を実行します。
Window10 のみがあれば 大丈夫です。 他には何も入りません。
Window に付属 している C# コンパイラ( csc.exe ) とPowerShell ISE を使います。
Unix互換のShell命令がつかえます。lsはリスト,sal はエイリアスの設定です。
PowerShell スクリプト(ps1.ps1)は
結果は
となります。
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>
Re: 【Unity/C#】delegateが全然理解できません。
従来のコマンドプロンプトからコンパイル&実行するにはバッチ・ファイルをつくります。
cs.bat 実行はcs.batをダブルクリックするだけです。
http://www2.koyoen.birdview.co.jp/~abcxyz/7.jpg
http://www2.koyoen.birdview.co.jp/~abcxyz/8.jpg
cs.bat 実行はcs.batをダブルクリックするだけです。
http://www2.koyoen.birdview.co.jp/~abcxyz/7.jpg
http://www2.koyoen.birdview.co.jp/~abcxyz/8.jpg
Re: 【Unity/C#】delegateが全然理解できません。
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
http://www2.koyoen.birdview.co.jp/~abcxyz/b.jpg
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!");
}
}
}
Re: 【Unity/C#】delegateが全然理解できません。
従来のコマンドプロンプトからコンパイル&実行するにはバッチ・ファイルをつくります。
cs.bat http://www2.koyoen.birdview.co.jp/~abcxyz/d.jpg
cs.bat 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!
Re: 【Unity/C#】delegateが全然理解できません。
PowerShell プログラム
この2行でFormが表示できます。
http://www2.koyoen.birdview.co.jp/~abcxyz/e.jpg
VisualStudioのように入力補完が出来ます。
http://www2.koyoen.birdview.co.jp/~abcxyz/f.jpg
http://www2.koyoen.birdview.co.jp/~abcxyz/e.jpg
VisualStudioのように入力補完が出来ます。
http://www2.koyoen.birdview.co.jp/~abcxyz/f.jpg
Re: 【Unity/C#】delegateが全然理解できません。
C#では
cs.bat cs1.cs
http://www2.koyoen.birdview.co.jp/~abcxyz/h.jpg
cs.bat cs1.cs
using System;
using System.Windows.Forms;
public class Program
{
[STAThread]
static void Main()
{
Form f;
f=new Form();
f.ShowDialog();
}
}
Re: 【Unity/C#】delegateが全然理解できません。
C#と同様なPowerShell プログラムの例。VisualStudioのように入力補完が出来ます。
http://www2.koyoen.birdview.co.jp/~abcxyz/j.jpg
http://www2.koyoen.birdview.co.jp/~abcxyz/i.jpg
<#
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/i.jpg
Math
>[雑談]
>Visual Basic 2015は2015年に.NET Framework 4.6とともに公開された。Roslynと呼ばれるコンパイラレイヤーにより、Visual C#と同等のIDE機
>能を備えるに至った。
(C#の開発責任者がVBも兼任し約2000万行を使って開発したときいている。)
--------------------------------------------------------------------------------
VBの場合の ラムダ式 の書き方です。VBはC#より容易に取り組む事が出来てC#と同様のことが出来るようになりました。
C#の場合と同様のVBのプログラムです。
vb1.vb
AddHandler b.Click, Sub(sender, e) t.Text = "C# ボタン: Hello!"の部分が 「ラムダ式」 です。
VBの応答ファイルには
/imports:System
/imports:Microsoft.VisualBasic
/imports:System.Linq
/imports:System.Xml.Linq
が書かれているのでソースには書く必要がありません。追加のimportsはPowerShell, バッチファイル側に書くことが出来ます。
vb.rsp
http://www2.koyoen.birdview.co.jp/~abcxyz/n.jpg
>Visual Basic 2015は2015年に.NET Framework 4.6とともに公開された。Roslynと呼ばれるコンパイラレイヤーにより、Visual C#と同等のIDE機
>能を備えるに至った。
(C#の開発責任者がVBも兼任し約2000万行を使って開発したときいている。)
--------------------------------------------------------------------------------
VBの場合の ラムダ式 の書き方です。VBはC#より容易に取り組む事が出来てC#と同様のことが出来るようになりました。
C#の場合と同様のVBのプログラムです。
vb1.vb
Module Module1
Private f As Form
Private t As TextBox
Private b As Button
Sub Main()
f = New Form()
t = New TextBox()
b = New Button()
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(t)
f.Controls.Add(b)
AddHandler b.Click, Sub(sender, e) t.Text = "C# ボタン: Hello!"
Application.Run(f)
End Sub
End Module
AddHandler b.Click, Sub(sender, e) t.Text = "C# ボタン: Hello!"の部分が 「ラムダ式」 です。
VBの応答ファイルには
/imports:System
/imports:Microsoft.VisualBasic
/imports:System.Linq
/imports:System.Xml.Linq
が書かれているのでソースには書く必要がありません。追加のimportsはPowerShell, バッチファイル側に書くことが出来ます。
vb.rsp
# This file contains command-line options that the VB
# command line compiler (VBC) will process as part
# of every compilation, unless the "/noconfig" option
# is specified.
# Reference the common Framework libraries
/r:Accessibility.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Data.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.Formatters.Soap.dll
/r:System.Security.dll
/r:System.ServiceProcess.dll
/r:System.Transactions.dll
/r:System.Web.dll
/r:System.Web.Mobile.dll
/r:System.Web.RegularExpressions.dll
/r:System.Web.Services.dll
/r:System.Windows.Forms.Dll
/r:System.XML.dll
/r:System.Workflow.Activities.dll
/r:System.Workflow.ComponentModel.dll
/r:System.Workflow.Runtime.dll
/r:System.Runtime.Serialization.dll
/r:System.ServiceModel.dll
/r:System.Core.dll
/r:System.Xml.Linq.dll
/r:System.Data.Linq.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Web.Extensions.dll
/r:System.Web.Extensions.Design.dll
/r:System.ServiceModel.Web.dll
# Import System and Microsoft.VisualBasic
/imports:System
/imports:Microsoft.VisualBasic
/imports:System.Linq
/imports:System.Xml.Linq
/optioninfer+
Re: 【Unity/C#】delegateが全然理解できません。
従来のコマンドプロンプトからコンパイル&実行するにはバッチ・ファイルをつくります。
vb.bat
http://www2.koyoen.birdview.co.jp/~abcxyz/o.jpg
vb.bat
DIR
C:\windows\Microsoft.NET\Framework64\v4.0.30319\vbc.exe vb1.vb /imports:System.Windows.Forms /imports:System.Drawing
.\vb1.exe
pause
Re: 【Unity/C#】delegateが全然理解できません。
C# [継承] を使用した場合の例
従来のコマンドプロンプトからコンパイル&実行する。バッチ・ファイルを使用します。
C#
cs.bat cs1.cs
http://www2.koyoen.birdview.co.jp/~abcxyz/p.jpg
http://www2.koyoen.birdview.co.jp/~abcxyz/r.jpg
従来のコマンドプロンプトからコンパイル&実行する。バッチ・ファイルを使用します。
C#
cs.bat cs1.cs
/////
using System;
using System.Windows.Forms;
using System.Drawing;
public class f : Form
{
Button b;
TextBox t;
public f()
{
InitializeComponent();
}
private void InitializeComponent()
{
b = new Button();
t = new TextBox();
this.Text = "Form";
t.Text = "TextBox: ABCDE";
b.Text = "Button";
this.Size = new Size(300, 200);
this.Location = new Point(500, 400);
t.Location = new Point(30, 20);
b.Location = new Point(30, 60);
this.Controls.Add(b);
this.Controls.Add(t);
b.Click += (sender, e) => { t.Text = "C# : Form 継承"; };
b.Click += new System.EventHandler(button1_Click);
}
static void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("AAA");
}
}
/////
public class Program
{
[STAThread]
static void Main()
{
Application.Run(new f());
}
}
http://www2.koyoen.birdview.co.jp/~abcxyz/r.jpg
Re: 【Unity/C#】delegateが全然理解できません。
VisualStudio風に3分割して書き直せば
cs.bat
Program.cs
Form1.cs
Form1.Designer.cs
http://www2.koyoen.birdview.co.jp/~abcxyz/q.jpg
cs.bat
DIR
C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs Form1.cs Form1.Designer.cs
.\Program.exe
pause
/////
using System;
using System.Windows.Forms;
public class Program
{
[STAThread]
static void Main()
{
Application.Run(new f());
}
}
/////
/////
using System;
using System.Windows.Forms;
partial class f : Form
{
public f()
{
InitializeComponent();
}
static void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("AAA");
}
}
/////
/////
using System;
using System.Windows.Forms;
using System.Drawing;
partial class f : Form
{
Button b;
TextBox t;
private void InitializeComponent()
{
b = new Button();
t = new TextBox();
this.Text = "Form";
t.Text = "TextBox: ABCDE";
b.Text = "Button";
this.Size = new Size(300, 200);
this.Location = new Point(500, 400);
t.Location = new Point(30, 20);
b.Location = new Point(30, 60);
this.Controls.Add(b);
this.Controls.Add(t);
b.Click += (sender, e) => { t.Text = "C# : Form 継承"; };
b.Click += new System.EventHandler(button1_Click);
}
}
/////
Re: 【Unity/C#】delegateが全然理解できません。
[ ① C#, DataGridView ]
(② VB, ③ PowerShell, ④ C++ (C++/CRL) で同じようなプログラムを作って比較してみる)
① C#
cs.bat cs1.cs
Xmlデータ
http://www2.koyoen.birdview.co.jp/~abcx ... idView.xml
実行
http://www2.koyoen.birdview.co.jp/~abcxyz/s.jpg
(② VB, ③ PowerShell, ④ C++ (C++/CRL) で同じようなプログラムを作って比較してみる)
① C#
cs.bat cs1.cs
using System;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
public class Program
{
[STAThread]
static void Main()
{
Form f;
Button b;
TextBox t;
DataGridView dg;
DataTable dt;
f = new Form();
b = new Button();
t = new TextBox();
dg = new DataGridView();
dt = new DataTable();
f.Text = "Form";
t.Text = "TextBox";
b.Text = "Button";
f.Size = new Size(300, 300);
f.Location = new Point(500, 400);
t.Location = new Point(20, 20);
b.Location = new Point(150, 20);
dg.Location = new Point(20, 60);
f.Controls.Add(b);
f.Controls.Add(t);
f.Controls.Add(dg);
dg.Anchor = (AnchorStyles)15;
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
dg.DataSource = dt;
dt.TableName="dtSheet1";
dt.ReadXml("DataGridView.xml");
dg.CurrentCell = dg[2, 100];
dg.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
b.Click += (sender, e) => t.Text = dg.CurrentRow.Cells[2].Value.ToString();
Application.Run(f);
}
}
http://www2.koyoen.birdview.co.jp/~abcx ... idView.xml
実行
http://www2.koyoen.birdview.co.jp/~abcxyz/s.jpg
Re: 【Unity/C#】delegateが全然理解できません。
[ ② VB,, DataGridView ]の場合
vb.bat
vb1.vb
http://www2.koyoen.birdview.co.jp/~abcxyz/t.jpg
http://www2.koyoen.birdview.co.jp/~abcxyz/u.jpg
vb.bat
DIR
C:\windows\Microsoft.NET\Framework64\v4.0.30319\vbc.exe vb1.vb /imports:System.Windows.Forms /imports:System.Drawing ^
/imports:System.Data
.\vb1.exe
pause
vb1.vb
Module Module1
Private f As Form
Private t As TextBox
Private b As Button
Private dg As DataGridView
Private dt As DataTable
Sub Main()
f = New Form()
t = New TextBox()
b = New Button()
dg = New DataGridView()
dt = New DataTable()
f.Text = "Form"
t.Text = "TextBox: ABCDE"
b.Text = "Button"
f.Size = new Size(300, 300)
f.Location = new Point(500, 400)
t.Location = new Point(20, 20)
b.Location = new Point(150, 20)
dg.Location = new Point(20, 60)
f.Controls.Add(t)
f.Controls.Add(b)
f.Controls.Add(dg)
dg.Anchor =
(AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right)
dt.Columns.Add("A")
dt.Columns.Add("B")
dt.Columns.Add("C")
dg.DataSource = dt
dt.TableName="dtSheet1"
dt.ReadXml("DataGridView.xml")
dg.CurrentCell = dg(2, 100)
dg.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
AddHandler b.Click, Sub(sender, e) t.text=dg.CurrentRow.Cells(2).Value.ToString()
Application.Run(f)
End Sub
End Module
http://www2.koyoen.birdview.co.jp/~abcxyz/u.jpg
Re: 【Unity/C#】delegateが全然理解できません。
[ ③ PowerShell, DataGridView ]の場合
p.bat ps1.ps1
http://www2.koyoen.birdview.co.jp/~abcxyz/v.jpg
p.bat ps1.ps1
ls
# Add-Type -AssemblyName System.Windows.Forms #不要:デフォルトで
# Add-Type -AssemblyName System.Drawing #参照設定される
Add-Type -AssemblyName System.Data
$f = New-Object System.Windows.Forms.Form
$b = New-Object System.Windows.Forms.Button
$t = New-Object System.Windows.Forms.TextBox
$dg = New-Object System.Windows.Forms.DataGridView
$dt = New-Object System.Data.DataTable
$f.Text = "Form"
$t.Text = "TextBox:ABCDE"
$b.Text = "Button"
$f.Size = New-Object System.Drawing.Size(300,300)
$f.Location = New-Object System.Drawing.Point(500, 400);
$t.Location = New-Object System.Drawing.Point(20, 20);
$b.Location = New-Object System.Drawing.Point(150, 20);
$dg.Location = New-Object System.Drawing.Point(20, 60);
$dg.Anchor = 15
$f.Controls.Add($b);
$f.Controls.Add($t);
$f.Controls.Add($dg);
$dt.Columns.Add("A")
$dt.Columns.Add("B")
$dt.Columns.Add("C")
$dg.DataSource = $dt
$dt.TableName ="dtSheet1"
$dt.ReadXml("DataGridView.xml")
$dg.AutoSizeColumnsMode = 8
$b_Click = { $t.Text = "P.shell ボタン: Hello!:AAA" }
$b.Add_Click($b_Click)
[System.Windows.Forms.Application]::Run($f)
Re: 【Unity/C#】delegateが全然理解できません。
[ ④ C++ (C++/CRL), DataGridView ]の場合
C#,VB,PowerShell はWindows10だけあればよいのですが C++はVisualStudioが必要です。開発者用コマンドプロンプトを使います。
今回はVS2017Communityを使います。
f_bat.bat f.cpp
http://www2.koyoen.birdview.co.jp/~abcxyz/w.jpg
C#,VB,PowerShell はWindows10だけあればよいのですが C++はVisualStudioが必要です。開発者用コマンドプロンプトを使います。
今回はVS2017Communityを使います。
f_bat.bat f.cpp
/////
#using <System.dll>
#using <System.Xml.dll>
#using <System.Data.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
/////
using namespace System;
using namespace System::Xml;
using namespace System::Data;
using namespace System::Windows::Forms ;
using namespace System::Drawing ;
/////
void main(){
Form^ f;
Button^ b;
TextBox^ t;
DataGridView^ dg;
DataTable^ dt;
f = gcnew Form();
b = gcnew Button();
t = gcnew TextBox();
dg = gcnew DataGridView();
dt = gcnew DataTable();
f->Text = L"Form";
t->Text = L"TextBox: ABCDE";
b->Text = L"Button";
f->Size = Size(300, 300);
f->Location = Point(500, 400);
t->Location = Point(20, 20);
b->Location = Point(150, 20);
dg->Location = Point(20, 60);
f->Controls->Add(b);
f->Controls->Add(t);
f->Controls->Add(dg);
dg->DataSource = dt;
dt->TableName="dtSheet1";
dt->Columns->Add(L"A");
dt->Columns->Add(L"B");
dt->Columns->Add(L"C");
dt->ReadXml("DataGridView.xml");
dg->AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode::AllCells;
dg->Anchor = (AnchorStyles)15;
Application::Run(f);
}
/////
Re: 【Unity/C#】delegateが全然理解できません。
今幼稚園・年長組~小学生にむけてスクラッチの教室がふえています。 スクラッチhttps://ja.wikipedia.org/wiki/Scratch_( ... %E8%AA%9E)
の本を5冊ほど読んでますが Scratch のつぎは Unity が推奨されています。
C#の需要はましてくるとおもわれるしC++のオブジェクト指向の勉強にてきしています。
C++ とDelegate
http://marupeke296.com/DP_Delegate.html
C11,C14 の ラムダ式
https://cpprefjp.github.io/lang/cpp11/l ... sions.html
の本を5冊ほど読んでますが Scratch のつぎは Unity が推奨されています。
C#の需要はましてくるとおもわれるしC++のオブジェクト指向の勉強にてきしています。
C++ とDelegate
http://marupeke296.com/DP_Delegate.html
C11,C14 の ラムダ式
https://cpprefjp.github.io/lang/cpp11/l ... sions.html
Re: 【Unity/C#】delegateが全然理解できません。
delegate (基本的な)
f.bat f.cs
実行
http://www2.koyoen.birdview.co.jp/~abcxyz/さ.jpg
f.bat f.cs
using System;
using System.Windows.Forms;
using System.Drawing;
delegate int del(int i);
public class Program
{
static int Func(int i){ return i * i; }
[STAThread]
static void Main()
{
del d = new del(Func);
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);
t.Text = d(3).ToString();
f.Text = d(5).ToString();
b.Click += (sender, e) => MessageBox.Show("delegate");
Application.Run(f);
}
}
G:\zCS\002\001>del f.exe
G:\zCS\002\001>C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe f.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:\zCS\002\001>f.exe
Re: 【Unity/C#】delegateが全然理解できません。
Windows10 のみで C# をMSBuild.exe を使ってVisual Studio風にプロジェクトとしてビルド(Compile)することによって XAML、WPFプログラムもビルドできる。
いま簡単なC# プログラムをプロジェクトとしてビルドしてみる。
C# ソースファイルをメモ帳で簡単につくれるようにcs.txtとする。
cs.txt
プロジェクト・ファイルもテキストファイルでcsproj.txtとする。
csproj.txt
起動するバッチファイルをBuild.batとする。
Build.bat 実行結果
http://www2.koyoen.birdview.co.jp/~abcxyz/つ.jpg
いま簡単なC# プログラムをプロジェクトとしてビルドしてみる。
C# ソースファイルをメモ帳で簡単につくれるようにcs.txtとする。
cs.txt
using System.Windows.Forms;
namespace HelloWorld
{
class Hello
{
static void Main()
{
MessageBox.Show("Hello World!");
}
}
}
csproj.txt
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Include="cs.txt" />
</ItemGroup>
<Target Name="Build">
<Csc Sources="@(Compile)"/>
</Target>
</Project>
Build.bat 実行結果
G:\zCS\001\099_Build_bat_csproj\csc\cs_Build>C:\windows\Microsoft.NET\Framework64\v4.0.30319\MSbuild.exe csproj.txt
Microsoft (R) Build Engine バージョン 4.7.2556.0
[Microsoft .NET Framework、バージョン 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.
2018/01/28 20:47:00 にビルドを開始しました。
ノード 1 上のプロジェクト "G:\zCS\001\099_Build_bat_csproj\csc\cs_Build\csproj.txt" (既定のターゲット)。
Build:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Csc.exe /out:cs.exe cs.txt
プロジェクト "G:\zCS\001\099_Build_bat_csproj\csc\cs_Build\csproj.txt" (既定のターゲット) のビルドが完了しました。
ビルドに成功しました。
0 個の警告
0 エラー
経過時間 00:00:06.25
G:\zCS\001\099_Build_bat_csproj\csc\cs_Build>cs.exe
Re: 【Unity/C#】delegateが全然理解できません。
[Windows10のみで出来る 簡単な C# xaml (WPF) の ビルド ]
2つ xaml
App.xaml
MainWindow.xaml
csproj.txt
実行結果
http://www2.koyoen.birdview.co.jp/~abcxyz/と.jpg
2つ xaml
App.xaml
<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
</Application>
<Window x:Class="MainWindow"
xmlns=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="wpf-App-MainWindow" Height="200" Width="300">
<Grid>
<Label Content="wpf:Hello World! " FontSize="32"
HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</Window>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0"
xmlns=
"http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AssemblyName>App1</AssemblyName>
<Platform>x64</Platform>
<OutputType>WinExe</OutputType>
<OutputPath>.\bin\Release</OutputPath>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
</PropertyGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="WindowsBase" />
<Reference Include="System" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
</ItemGroup>
<Import Project=
"$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
C:\windows\Microsoft.NET\Framework64\v4.0.30319\MSbuild.exe ^
csproj.txt
.\bin\Release\App1.exe
pause
G:\zCS\wpf\001\0129>C:\windows\Microsoft.NET\Framework64\v4.0.30319\MSbuild.exe csproj.txt
Microsoft (R) Build Engine バージョン 4.7.2556.0
[Microsoft .NET Framework、バージョン 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.
2018/01/29 18:56:18 にビルドを開始しました。
ノード 1 上のプロジェクト "G:\zCS\wpf\001\0129\csproj.txt" (既定のターゲット)。
MainResourcesGeneration:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "MainResourcesGeneration" を省略します。
GenerateTargetFrameworkMonikerAttribute:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "GenerateTargetFrameworkMonikerAttribute" を省略します 。
CoreCompile:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "CoreCompile" を省略します。
CopyFilesToOutputDirectory:
csproj -> G:\zCS\wpf\001\0129\bin\Release\App1.exe
プロジェクト "G:\zCS\wpf\001\0129\csproj.txt" (既定のターゲット) のビルドが完了しました。
ビルドに成功しました。
0 個の警告
0 エラー
経過時間 00:00:05.48
G:\zCS\wpf\001\0129>.\bin\Release\App1.exe
Re: 【Unity/C#】delegateが全然理解できません。
bld.bat
が抜けていました。
出来た中間コード
App.g.cs
MainWindow.g.cs
C:\windows\Microsoft.NET\Framework64\v4.0.30319\MSbuild.exe ^
csproj.txt
.\bin\Release\App1.exe
pause
出来た中間コード
App.g.cs
#pragma checksum "..\..\..\App.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "EEC667FD340FC0261FC4557CA342AE31B26D446E"
//------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
// ランタイム バージョン:4.0.30319.42000
//
// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
// コードが再生成されるときに損失したりします。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
/// <summary>
/// Application
/// </summary>
public partial class Application : System.Windows.Application {
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
#line 4 "..\..\..\App.xaml"
this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
#line default
#line hidden
}
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
Application app = new Application();
app.InitializeComponent();
app.Run();
}
}
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0186FAF3C4BBC47F6D6DD34CF1B1856533902667"
//------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
// ランタイム バージョン:4.0.30319.42000
//
// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
// コードが再生成されるときに損失したりします。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
/// <summary>
/// MainWindow
/// </summary>
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/App1;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
this._contentLoaded = true;
}
}
Re: 【Unity/C#】delegateが全然理解できません。
[ 匿名関数 ]
C# では、式中で、その場限りのメソッドを書くことができる 匿名関数(anonymous function)という機能があります。
歴史的経緯から、匿名関数には、C# 2.0 で導入された匿名メソッド式という書き方と、 C# 3.0 で導入されたラムダ式という書き方があります。
(匿名メソッド式とラムダ式を合わせて「匿名関数」という総称が与えられた。ラムダ式のことを含めて匿名メソッドと呼ぶこともあります。)
No.40 を書き換えて
http://www2.koyoen.birdview.co.jp/~abcxyz/ね.png
C# では、式中で、その場限りのメソッドを書くことができる 匿名関数(anonymous function)という機能があります。
歴史的経緯から、匿名関数には、C# 2.0 で導入された匿名メソッド式という書き方と、 C# 3.0 で導入されたラムダ式という書き方があります。
(匿名メソッド式とラムダ式を合わせて「匿名関数」という総称が与えられた。ラムダ式のことを含めて匿名メソッドと呼ぶこともあります。)
No.40 を書き換えて
using System;
using System.Windows.Forms;
using System.Drawing;
delegate int del(int i);
public class Program
{
// --- static int Func(int i){ return i * i; }
[STAThread]
static void Main()
{
// --- del d = new del(Func);
del d = delegate(int i){
return i * i;
};
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);
t.Text = d(3).ToString();
f.Text = d(5).ToString();
b.Click += (sender, e) => MessageBox.Show("delegate");
Application.Run(f);
}
}