program study story

プログラムの勉強 アウトプット

C#_ラムダ式

ラムダ式の活用のメリット:ラムダ式の活用のメリット:① 匿名メソッドを2.0の頃の記法より簡単に書ける② 上述の匿名メソッドと同じ記法で式木を作れる

①について
■ 匿名メソッドの記法の簡略化・匿名メソッドの定義から、delegateとか{return}とかの記述を省略できる・型推論機構が働く匿名メソッドをラムダ式を使って書き直す。
例:--------------------------------------------------------------------------------- 匿名メソッド構文--------------------------------------------------------------------------------- delegate(int n) {   return n > 0; }--------------------------------------------------------------------------------- 匿名メソッド構文→ラムダ式---------------------------------------------------------------------------------        delegate bool pred(int n);
        static void Main(string args)        {                        pred p=(int n) => { return n > 0; };        }        --------------------------------------------------------------------------------- ラムダ式:引数の型なし記載方法---------------------------------------------------------------------------------        delegate bool pred(int n);
static void Main(string
args)        {                        pred p= n => { return n > 0; };        }                --------------------------------------------------------------------------------- ラムダ式:引数の型なし、{},returnなし記載方法---------------------------------------------------------------------------------        delegate bool pred(int n);
static void Main(string args)        {                        pred p=n => n > 0;        }---------------------------------------------------------------------------------
②について
■ 式木とは式(数式)を木構造で表したもののこと。
ラムダ式は、Expression型の変数に代入すると、匿名デリゲートではなく、式木としてコンパイルされる。
ラムダ式をあるときには実行コードとして、またあるときはデータとして利用することができる。
デリゲートに代入するか、Expression型に代入するかによってコンパイル結果を変えることで、関数型言語と似たような動作を実現している。
■ 式木の制約:
ラムダ式を式木にできるのは、単文の({ }を使わない)ラムダ式のみ。
四則演算やメソッドコールはできるが、forやwhileなどの制御構文は、式木にできない。

■ 初期化子
C#3.0オブジェクト初期化子で指定できるのはpublicなメンバー変数またはプロパティのみ。(初期化子を書く場所によってはprotechedやinternalも可。初期化子を書いた場所からアクセスできる変数・プロパティのみ)
初期化子のメリット:・クラスのメンバー変数の初期化・式木への代入が可能になる
◇ コレクション初期化
配列と同じように初期化記法を、任意のコレクションクラスに対して行うことができる。また、リスト型のコレクションのみではなく、IDictinary<TKey,TValue>のような辞書クラスに対しても、以下のような記法で初期化できる。(引数2つのAddメソッドが呼ばれる)※コレクションクラス・・System.Collections.IEnumerableインターフェースを実装していて、Addメソッドを持つクラス
◇ インデックス初期化
C#6.0インデクサーを混ぜれるようになった。また、プロパティの代入とインデクサーへの代入を混在させることも可。
例:---------------------------------------------------------------------------------
 class Program    {        static void Main(string args)        {            // プロパティへの代入とインデクサーへの代入を混在させることができる。            var s = new Sample            {                Name = "sample",                ["X"] = 1,                ["Y"] = 2,            };        }    }
    class Sample    {        // プロパティ_定義        public string Name { get; set; } 
        // インデクサー_定義        public int this[string key]         {            get { return 0; }            set { }        }    }
---------------------------------------------------------------------------------
◇ 再帰初期化
再帰的な構造を持ったクラスの初期化もできる。
再帰的な初期化の制限:
メンバーが参照型(class)である必要がある。(値型(struct)だった場合は、コンパイルエラーになる)
(注) 記法での初期化は、インスタンスをnewしてくれたりはしない。コンストラクターもしくはメンバー初期化子での初期化 が必要。

 

1週間でC#の基礎が学べる本

1週間でC#の基礎が学べる本

  • 作者:亀田 健司
  • 発売日: 2019/09/12
  • メディア: Kindle版
 

 

デリゲートにおけるローカル変数と匿名関数

ローカル関数と匿名関数の比較

関数内に関数を書く方法として、
ローカル関数と匿名関数という2つの機能がある。

共通の性質:
・定義している関数の中でしか使えない
・周りの(定義している関数側にある)ローカル変数を取り込める。

ローカル関数

できることは多いが、書ける場所は少ない。
通常のメソッドでできることであれば概ね何でもできる。
再帰呼び出し
イテレータ
・非同期メソッド
メソッド内に限らず、関数メンバーならどれの中でも定義できます。

ローカル関数を利用する動機:
・定義した関数内からだけ使えるということ

利用例:

例1:イテレーターの引数チェック

 


匿名関数

できることに少し制限がある代わりに、どこでも書ける。

 

 

デリゲート内部で起こっていること

■ 型定義

インスタンスと関数ポインターのペア。
記述されているものと別で、2つのフィールドがあって、
1つは、マルチキャスト用、もう一つは静的メソッドのために使うフィールドが
作られる。

■ デリゲートのインスタンス生成

デリゲート型の変数に対してメソッドを直接渡すような形でデリゲートを作る。

■ 静的メソッドを渡すと遅い

デリゲートはインスタンスメソッドの時に処理が単純で高速になるように作られている。
C#ではインスタンスメソッドの方が圧倒的に利用頻度が高いので、インスタンスメソッドに
対して最適化したほうが、全体としてのパフォーマンスは上がる。

■ カリー化デリゲート

デリゲート越しの静的メソッドの呼び出しを早くする方法が1つある。
カリー化デリゲートという手段を使うと、インスタンスメソッドと同じで
静的メソッドを呼べるようになる。

拡張メソッドは、実体として、第1引数でインスタンスを受け取る構造になっていて
これがインスタンスメソッドの暗黙的なthis引数と同じ受け取り方になっている。

---------------------------------------------------------------------------------------------------

 

 


class Sample
{
public void InstanceMethod(int x)
{
// 引数が1つだけに見えて、実は暗黙的に this を受け取っている
}

続きを読む

C# 基礎_デリゲート

関数指向について

---------------------------------------------------------------
関数(function)中心の設計

メソッドをオブジェクトとして扱う → デリゲート

デリゲートが有用な場面 → イベント駆動、高階関数、非同期処理

純粋な関数(pure function)

フィールド等を参照せず、同じ入力に対して常に同じ出力を返す関数
---------------------------------------------------------------

■ デリゲート
 デリゲートとは、メソッドを参照するための型。

デ李ゲートは、述語やイベントハンドラ等に利用する。

C言語の関数ポインターとの違い

インスタンスメソッドを参照したり、複数メソッドを同時に参照することができる

delegate(委譲):

「他のメソッドに処理を丸投げするためのオブジェクト」というような意味。

イベントが起きたときのイベントハンドリングをどのメソッドに丸投げ(委託)するかを
指示するためなどに使われる。

デリゲートの定義について

delegateを使用するには、まず、

delegate 戻り値の型 デリゲート型名(引数リスト);

特徴:
・定義したデリゲート型は、ユーザ定義のクラスや構造体と同じ1つの型として扱われる。
・デリゲート型は自動的にSystem,Delegateクラスの派生クラスになる。

C#のデリゲートの利点:

インスタンスメソッドの代入が可能
◇ 複数のメソッドを代入できる
◇ 非同期呼び出し


インスタンスメソッドの代入

・クラス(static)メソッドとインスタンス(非static)メソッドの
どちらでも代入することが出来る。

◇複数のメソッドを代入する際

+=演算子を用意いることで、複数のメソッドを代入することができる。

→複数のメソッドを代入した状態で、デリゲート呼び出しを行うと、
 代入した全てのメソッドが呼び出される。


複数のメソッドを格納した状態のデリゲートのことを「マルチキャストデリゲート」
と呼ぶ。

マルチキャストデリゲートの呼び出しは、+=で代入した順に逐次実行される。

◇ 非同期呼び出し

非同期呼び出し(Asynchronous Call)とは

メソッドを呼び出した瞬間に呼び出し元に処理が戻ってくるような呼び出しのこと。

メソッドを呼び出しをすると、デリゲートを介して呼び出されるメソッドの処理と、
呼び出し元の処理が並行して行われることになる。(マルチスレッド)

 

デリゲート型を定義すると、C#コンパイラによって自動的にBeginInvokeとEndInvoke
というメソッドが生成される。

BeginInbokeを用いることで、非同期呼び出しを開始し、EndInvokeを用いることにより、
非同期処理が終了を待つことができる。

BeginInvokeの処理:流れ

デリゲート型の定義時に引数リストで指定した引数と、System.AsyncCallbackデリゲート型の
引数およびobject型の引数をとり、System.IAsyncResultインターフェース型の値を返す。

EndInvokeの処理:流れ

デリゲート型の定義時にrefまたはoutキーワードを付けた引数およびSystem.IAsyncResult
インターフェースの引数を持ち、デリゲートの戻り値と同じ型の戻り値を持つ。

■ デリゲートの用途

プログラミングの世界での述語の定義

あるオブジェクトxが「xは○○である」という条件を満たすかどうか
調べるメソッドのことをいう。

例題:

static int Select(int x)
{
int n=0;
foreach(int i in x) if(i > 10) ++n;

int y = new int[n];
n=0;
foreach(int i in x)
if(i > 10)
{
y[n] = i;
++n;
}

return y;
}

例題を述語使って実装:

delegate bool Predicate(int n);

tatic int Select(int x, Predicate pred)
{
int n=0;
foreach(int i in x)
if(pred(i)) ++n;

int y = new int[n];

n=0;
foreach(int i in x)
if(pred(i))
{
y[n] = i;
++n;
}

return y;
}

例題に述語を使って、使用する際の例:

using System;

delegate bool Predicate(int n);

class DelegateTest
{
static void Main()
{
int x = new int{1, 8, 4, 11, 8, 15, 12, 19};

// x の中から値が 10 以上のもだけ取り出す
int y = Select(x, new Predicate(IsOver10));
foreach(int i in y)
Console.Write("{0} ", i);
Console.Write("\n");

// x の中から値が (5, 15) の範囲にあるものだけ取り出す
int z = Select(x, new Predicate(Is5to15));
foreach(int i in z)
Console.Write("{0} ", i);
Console.Write("\n");
}

static bool IsOver10(int n){return n > 10;}
static bool Is5to15(int n){return (n > 5) && (n < 15);}

/// <summary>
/// x の中から条件 pred を満たすものだけを取り出す。
/// </summary>
/// <param name="x">対象となる配列</param>
/// <param name="pred">述語</param>
/// <returns>条件を満たすものだけを取り出した配列</returns>
static int Select(int x, Predicate pred)
{
int n=0;
foreach(int i in x)
if(pred(i)) ++n;

int y = new int[n];

n=0;
foreach(int i in x)
if(pred(i))
{
y[n] = i;
++n;
}

return y;
}
}

■ 匿名関数

匿名関数には、C#2.0とC#3.0で導入された2つのパターンがある。

・匿名メソッド式
ラムダ式

匿名メソッド式は概念のみ
現在使用されているのは、ラムダ式が多い。

◇匿名メソッドとは、
delegateキーワードから始まり、メソッドの中身を任意の箇所に埋め込んだ
部分のことをいう。

ラムダ式
ラムダ式とは
 関数(メソッド)を整数などの変数と全く同列に扱う手法のこと。

・匿名関数としても使えるもの、式木を作れる。

匿名メソッド式からラムダ式への移り変わり方

--------------------------------------------------------------
delegate(int n){ return n > 10; }
--------------------------------------------------------------
C#2.0バージョン(匿名メソッド式)

--------------------------------------------------------------
(int n) => { return n > 10; }
--------------------------------------------------------------
C#3.0バージョン(ラムダ式)
delegateキーワードが省略されている

--------------------------------------------------------------
Func<int,bool> f = n => { return n > 10; };
--------------------------------------------------------------
C#3.0バージョン(ラムダ式)
変数の型が左辺値や関数の引数から推論できる場合には簡素化できて、
省略ができる。
(int n)の型を省略

Func(int,bool)には、デリゲートのPredicateクラスにより、
Func(T,bool)型であるため、Func(T,bool)のTが(int x)と分かっていることから
省略が可能となっている。

--------------------------------------------------------------
Func<int,bool> f = n => n > 10;
--------------------------------------------------------------
C#3.0バージョン(ラムダ式)

ラムダ式の中身がreturn文1つだけの場合
{ }やreturnも省略できる。

省略前
--------------------------------------------------------------
Func<int,bool> f = delegate(int n){ return n > 10; };
--------------------------------------------------------------
上と下のコードは同じ意味になる。

省略後
--------------------------------------------------------------
Func<int,bool> f = n => n > 10;
--------------------------------------------------------------

使える既存デリゲートメソッド

・MehtodInvokerデリゲート(System.Windows.Forms名前空間)
・Actionデリゲート(System名前空間)
・Action<T>ジェネリック・デリゲート(System名前空間)
・Action<T1,T2>ジェネリック・デリゲート(System名前空間)
・Action<T1,T2,T3>ジェネリック・デリゲート(System名前空間)
・Action<T1,T2,T3,T4>ジェネリック・デリゲート(System名前空間)
・Predicate<T>ジェネリック・デリゲート(System名前空間)
・Func<TResult>ジェネリック・デリゲート(System名前空間)
・Func<T,TResult>ジェネリック・デリゲート(System名前空間)
・Func<T1,T2,TResult>ジェネリック・デリゲート(System名前空間)
・Func<T1,T2,T3,TResult>ジェネリック・デリゲート(System名前空間)
・Func<T1,T2,T3,T4,TResult>ジェネリック・デリゲート(System名前空間)

URL:参考
https://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_02/csharp30_02_02.html

■ covariance(共変性)と contravariance(反変性)

・covariance
基底クラスを戻り値とするデリゲートに対して、
派生クラスを戻り値とするメソッドを代入できること。

例:

class Base { }
class Derived : Base { }

delegate Base DelegateBaseReturn();

class Program
{
static void Main(string args)
{
Base xb;
xb = BaseReturn();  // 型が完全一致
xb = DerivedReturn();  // 基底クラスへのキャストは合法

DelegateBaseReturn db;
db = BaseReturn;  // 型が完全に一致
db += DerivedReturn;  // 戻り値の型が違うけど、これもok
xb = db();

}
static Base BaseReturn() { return new Base(); }
static Derived DerivedReturn() { return new Derived(); }

  }

(考察)
delegate Base DelegateBaseReturn();が入ったdbに対して、
static Derived DerivedReturn() { return new Derived(); }
が派生クラス(Derived)であるため、戻り値が違っても代入可能になっている。

・contravariance
派生クラスを引数とするデリゲートに対して、基底クラスを引数とするデリゲートを
代入できること。

例:

  class Base { }
class Derived : Base { }

delegate void DelegateDerivedParameter(Derived x);

class Program
{
static void Main(string[] args)
{
Derived xd = new Derived();
DerivedParameter(xd);  // 型が完全一致
BaseParameter(xd);  // 基底クラスへのキャストは合法

DelegateDerivedParameter dd;
dd = DerivedParameter;  // 型が完全一致
dd += BaseParameter;  // 引数の型が違うけど、これもok

}

static void BaseParameter(Base x) { }
static void DerivedParameter(Derived x) { }

}
(考察)

DelegateDerivedParameter(Derived x)とDerivedParameter(Derived x)は一緒だが、
BaseParameter(Base x)のように引数の型が違う場合でも、
派生クラスの引数に基底クラスは入れられる。

 

Visual C# 2017パーフェクトマスター (Perfect Master)

Visual C# 2017パーフェクトマスター (Perfect Master)

  • 作者:金城俊哉
  • 発売日: 2017/09/23
  • メディア: 単行本
 

 

iPhoneアプリ開発_知識

iPhoneアプリ開発で準備するもの
Mac
Xcode
AppleのDeveloper登録が必要で年間11,800円

 


Appleにアプリをリリースするには

AppStoreに公開するためには、
iTunesCoonnect,DeveloperCenterというサイトで設定をし申請を行う。

リリースの為には、AppleのDeveloper登録が必要で年間11,800円かかる。

iPhoneアプリで収益を上げるためには、
・有料ダウンロード
・広告
・アプリ内課金

有料アプリは、ゲームが多く購入される傾向に。

=ゲームアプリで多くの人に認知される必要がある。

広告は、アプリ内に広告を表示して収益を得る。
アプリ自体は無料で使い、広告を出すことで収益が上がる。

=多くの人にダウンロードしてもらう。

アプリ内課金はゲームによく使われる。

=ゲームアプリのクオリティ重視、面白いと思ってもらう人を一定数

 

Androidアプリ開発_知識

Androidアプリ開発で必要なもの
・パソコン(Mac/Windows/Linuxのいずれか)
・AndroidStuido,Eclipseという環境
java
Googleアカウントをデベロッパーとして登録する料金($25=3000円ほど)


Androidアプリを作ろうと思ったら
「企画→設計→開発」といった流れが一般的

個人で作るアプリであれば、アイデアが細かく決まっている必要はない。
作りながら、こういう機能が欲しいなどと思い浮かぶ。

・どんなアプリか
・誰がそのアプリを使うのか
・どんな機能、どんな画面が必要か
・(収益を得るならば)どこで収益を得るのか
など。


アプリをリリースしたい
Androidアプリをリリースするには、Google Playで公開することが一般的

アプリを公開するには、Google Playデベロッパーコンソールと公開用コンソールというものを
活用してリリースする。また、
それらを使用するためにGoogleアカウントをデベロッパーとして登録する必要がある。

登録料:$25(一度支払えば年数関係なく使用可能)支払う必要がある。

イテレーターとは

・IEnumeratorを簡単に実装するための機能。

イテレーターブロック:

イテレーターブロックを使うことで、「foreach文」で利用可能なコレクションを返す
メソッドやプロパティを簡単に実装することができる。

 

続きを読む