タグ

ブックマーク / ufcpp.net (61)

  • [雑記] Dispose にまつわる余談

    概要 「リソースの破棄」で説明したように、 C# で何らかのリソースの破棄が必要な場合、IDisposable インターフェイスを実装して、using ステートメントを使います。 この、IDisposable インターフェイス(の Dispose メソッド)の実装方法などに関して、少々注釈を。 IDisposable インターフェイスの実装 .NET の性質上、 明示的に破棄処理を書く必要があるリソースには、非管理リソース(unmanaged resource)と管理リソース(managed resource)の2種類あります。 非管理リソース .NET Framework (の自動メモリ管理)の範疇にないリソースです。 ネイティブ コードで書かれた OS 機能を直接呼び出す場合などです。 例えば、.NET の範疇でも File クラスを使ってファイルの読み書きができますが、 Window

    [雑記] Dispose にまつわる余談
  • C#スクリプト実行

    C#をスクリプト言語的に実行したり、インタラクティブ実行したりできるようになりました。 その実行方法や、通常の(コンパイルして使う)C#にはないスクリプト専用機能などについて説明します。 概要 いくつかの実行形態 アプリへの組み込み スクリプトとアプリとのやり取り C# インタラクティブ ウィンドウ dotnetコマンド スクリプト実行用の構文 結果の出力 トップ レベル スクリプト用ディレクティブ 概要 2015年末頃、ついにC#をスクリプト言語的に実行したり、インタラクティブに実行したりできるようになりました。すなわち、以下のようなことができるようになりました。 アプリへの組み込み アプリに組み込んで、そのアプリ用のマクロ言語としてC#を使う アプリを実行したままC#スクリプトを読み直して、動的にアプリの挙動を変える REPL(Read Eval Print Loop)実行 1行1行、

    C#スクリプト実行
  • ピックアップRoslyn 1/9: structural typing

    C#にstructural typing(構造的型付け)を入れようという案。 [Proposal][Roslyn] Add structural typing support #7844 まあ、「何人かでちょっとディスカッションしたよ」というくらいの段階みたい。やりたいことの説明や、構文の案(3案ほど)が出ている程度(実装方法に関する言及あまりなし)。 以下、structural typingがどういうものなのかについて簡単に説明。 Goのインターフェイスがそうなんですが、明示的な実装を必要とせず、「同じシグネチャ(名前+引数一致)さえ持っていればなんでもOK」という方針で代入可能な型システムをstructural typingと言います。 Javaとか.NETのインターフェイスやクラスの継承・実装、C++のクラス継承なんかは、以下のように、明示的な参照・実装が必要になります。こういうのは

    ピックアップRoslyn 1/9: structural typing
  • ハッシュテーブル

    概要 ハッシュテーブル(hash table)は、 「ハッシュ値」という物を使うことによって、 要素の挿入・削除・検索を非常に高速に行うことの出来るコレクションです。 挿入する要素の数よりも、余裕を見て大きめのメモリを確保して置くならば、 要素の挿入・削除・検索をほぼ O(1) (要素数によらず一定時間)で行うことができます。 ハッシュ値 ハッシュ(hash)というのは、 文字列などの任意のデータから、そのデータを要約して得られる固定長の値のことです。 得られた値のことをハッシュ値(hash value)、 値を得る操作をハッシュ関数(hash function)といいます。 ネットワークなどを通してメッセージを送る際、 通信路でエラーが混入していないかどうかを確かめるために、 送信元と受信先の双方でハッシュ値を計算し、値を比較するのに使われたりします。 hash という言葉は、料理のハッ

    ハッシュテーブル
  • 非同期処理(C# によるプログラミング入門)

    概要 注意: 2010年10月時点での CTP (community technology preview)版を元にした記事になっています。 製品版までに変更の可能性があります。 (async や await というキーワードも変更される可能性あり。) Ver. 5.0 スレッドを使った非同期処理を行いたい動機としては、以下の2つが挙げられます。 非ブロッキング処理: I/O 待ちとかで UI スレッドをフリーズさせないようにする 並列処理: マルチコアを活かした並列処理でパフォーマンス向上 このうち、並列処理に関しては、Parallel クラスや Parallel LINQ で簡単に対応可能 (ラムダ式や LINQ を使えば、並列じゃない場合とほとんど変わらず書けます。 参考: 「[雑記] スレッド プールとタスク」)。 一方の、非ブロッキング処理は、今までは結構面倒だったものの、 as

    非同期処理(C# によるプログラミング入門)
  • 変数操作関連の Cmdlet

    Set-Variable, Get-Variable $ を使って変数の読み書きをする以外に、 Set-Variable と Get-Variable という Cmdlet を使うことでも変数の読み書きができます。 > Set-Variable a 1 > Get-Variable a Name Value ---- ----- a 1 > $a = 2 > Get-Variable a Name Value ---- ----- a 2 まあ、単に値を代入するだけなら Set-Variable は必要ないんですが、 Set-Variable を使うと、 ReadOnly / Constant 属性を付与することができます。 > Set-Variable a 1 -option ReadOnly > $a = 0 変数 a は読み取り専用または定数であるため、上書きできません。 また、 G

    変数操作関連の Cmdlet
  • 属性

    概要 属性(attribute)とはクラスやメンバーに追加情報を与えるものです。 例えば、public や private などといったC#のキーワードもある種の属性と考えることが出来ます。 public ならば「このメンバーはクラス外からも参照可能」、 private ならば「このメンバーはクラス内のみから参照可能」という追加情報が与えられます。 C++ などの既存の言語では、このような追加情報を定義する場合、 言語仕様自体を拡張し、新たにコンパイラを作り直す必要がありました。 それに対し、C# では自分で属性を定義し、クラスやメンバーに付加することが出来ます。 すなわち、ライブラリで提供されている属性や自作した属性を用いることで、 コンパイラに対する指示を行ったり、クラスの利用者に対する情報を残すことが出来ます。 属性の情報は、以下のような場面で使われます。 条件コンパイルなどの、コン

    属性
  • 実行時型情報(C# によるプログラミング入門)

    で、実行時には、Width とか Height とかのメンバー名を知る必要はなく、 このレイアウトさえ分かっていればメンバーにアクセスできます。 x.Width にアクセスしたければ変数 x の格納されている場所の先頭を、 x.Height ならば x から4バイト目を見ればいいことになります。 要するに、Rect 構造体のメンバーへのアクセスは、 実行時には、以下のような(C 言語風の)コードと同じような扱いになっています。 // Rect x; char x[8]; // x.Width = 3; *((int *)(x + 0)) = 3; // y.Height = 4; *((int *)(x + 4)) = 4; 実行時型情報をサポートしない言語では、 実行時に不要な 「Rect 構造体は Width とか Height という名前のメンバーを持っている」 というような情報は削

    実行時型情報(C# によるプログラミング入門)
  • デリゲート

    概要 デリゲート(delegate: 代表、委譲、委託)とは、メソッドを参照するための型です。 C言語やC++言語の勉強をしたことがある人には、 「デリゲートとは関数ポインターや関数オブジェクトをオブジェクト指向に適するように拡張したもの」 と言った方が分かりやすいかもしれません。 デリゲートは用途も関数ポインターとほとんど同じで、 述語やイベントハンドラ(「イベント」で説明)等に利用します。 ただし、C言語の関数ポインターと違い、 インスタンスメソッドを参照したり、 複数のメソッドを同時に参照する事が出来ます。 delegate(委譲)という言葉のニュアンスとしては、 「他のメソッドに処理を丸投げするためのオブジェクト」というような意味です。 イベントが起きたときのイベントハンドリングをどのメソッドに丸投げ(委託)するかを指示するためなどに使われます。 ポイント C# では、メソッドも他

    デリゲート
  • 勉強用ページ

    using static System.Console; class Welcome { /// <summary> /// saying hello to all visitors and welcome. /// </summary> /// <param name="args">visitors</param> public static void Main(string[] args) { foreach(string visitor in args) { WriteLine($"Hello {visitor}."); } WriteLine("Welcome to my web page."); } } C# によるプログラミング入門 コンピュータの基礎知識 アルゴリズムとデータ構造 ブログ ようこそ ++C++; へ。 C#・情報工学を中心に勉強用ページとブログを載せています。

    勉強用ページ
  • C# によるプログラミング入門 [データ処理] LINQ

    概要 Ver. 3.0 C# 3.0(そして、同時に発表された VB 9.0)の目玉となる新機能は、 Language Integrated Query、略して LINQ と呼ばれるもので、 リレーショナルデータベースや XML に対する操作をプログラミング言語に統合するものです。 LINQ を用いることで、様々なタイプのデータソースに対する検索や操作を、 共通の構文で行うことができます。 IEnumeable を実装するコレクションクラスに対するもの(LINQ to Object)や、 XML に対するもの(LINQ to XML)、 それに、リレーショナルデータベースサーバに対する SQL クエリを生成するもの(LINQ to SQL)などがあります。 LINQ には以下のような利点があります。 オブジェクト指向言語らしい書き方でデータベースへの問い合わせができます。 in-memor

    C# によるプログラミング入門 [データ処理] LINQ
  • 組込み型

    int は integer (整数)の略で、short と long の意味は名前通り、記憶領域サイズの長い/短いの違いです。 byte も名前通りで「1バイトの変数」という意味です。 sbyte の「s」は signed の s で符号付きを意味します。 また、uint, ushort, ulong の「u」は unsigned の u で符号無しを意味します。 ちなみに、8バイトよりも大きな整数値を扱いたい場合、BigInteger構造体(System.Numerics名前空間)という物を使います。 (構造体や名前空間については別項にて説明します。) また、C# 9.0 で追加された nint、nuint は、 32ビット CPU で使う場合は int、uint と同じで、 64ビット CPU で使う場合は long、ulong と同じ範囲の値を使えます。 ただし、どちらのタイプの C

    組込み型
  • C# 3.0 の新機能

    2005年9月、C# 2.0 の正式出荷を目前にして、 C# の次世代拡張 C# 3.0 の言語仕様が公開されました。 C# 3.0(そして、同時に発表された VB 9.0)の目玉となる機能は、 Language Integrated Query、略して LINQ と呼ばれるもので、 リレーショナルデータベースや XML に対する操作をプログラミング言語に統合するものです。 (データベースや XML 操作用のライブラリと、 プログラミング言語中にSQL 風の問い合わせ構文を埋め込めるようにする言語拡張から成ります。) C# 3.0 に追加された機能の多くは、基的にこの LINQ を使うために必要な機能、 あるいは、より便利に LINQ を使うための機能になります。 ちなみに、詳しくは「小さな機能の組み合わせ」で説明していますが、 LINQという大きな目的を、小さな機能の組み合わせで実現し

    C# 3.0 の新機能
  • ラムダ式(C# によるプログラミング入門)

    概要 Ver. 3.0 ラムダ式(lambda expression)と言うのは、 関数型言語と呼ばれるような種類のプログラミング言語における用語なのですが、 関数(メソッド)を整数などの変数と全く同列に扱う手法のことです。 C# 3.0 で導入されたラムダ式は、 以下のようなものだと思ってください。 「デリゲート」に対して代入すると、「匿名メソッド式」と同じ扱いになる。 Expression 型の変数に代入すると、式木(expression tree)データになる。 ポイント C# 3.0 で導入されたラムダ式には、2通りの意味があります。 匿名メソッドを 2.0 の頃の記法より簡単に書ける。 上述の匿名メソッドと同じ記法で式木を作れる。 例:Func<int, int> square = x => x * x; 匿名メソッドの記法の簡略化 まず、1つ目。 ラムダ式は、 C# 2.0 の

    ラムダ式(C# によるプログラミング入門)
  • 環境のカスタマイズ

    概要 プロファイルディレクトリに色々ファイルを置くことでカスタマイズができるみたい。 プロファイルディレクトリ PowerShell Home C:\WINDOWS\system32\windowspowershell\v1.0 ここはユーザは直接触らない $env:ALLUSERSPROFILE 以下の \My Documents\WindowsPowerShell $env:userprofile 以下の \My Documents\WindowsPowerShell profile.ps1 プロファイルディレクトリ内に profile.ps1 を置いておくと、 PowerShell のホスト起動時に読み込まれる。 profile.ps1 に書いておくと便利そうな TIPS ?eq など http://d.hatena.ne.jp/newpops/20070111/p1 Windows

    環境のカスタマイズ
  • [雑記] 非同期制御フロー

    概要 C# 5.0のasync/awaitがなかったころ、少し複雑目な非同期制御フローをどうやって実現していたかという話。 C# 5.0を使えない状況下で非同期処理を書くことになった場合の参考としてや、async/awaitがどうやって実現されているかを知るきっかけになると思います。 サンプル コード(ZIP 形式。proj/sln 含め一式。) ポイント C# 5.0(await演算子)便利だなー await演算子が内部的にやっていることは、イテレーターに近い なので、昔はイテレーターを使って非同期処理をすることが結構あった サンプルの要件 今回の例として使うのは、Figure 1に示すような、確認ダイアログ表示のフロー。 確認ダイアログを表示する例 要は、何かを実行するにあたって、特定条件下では確認ダイアログの表示が必要で、すべてのダイアログで「OK」を押したときにだけ実行に移るという

    [雑記] 非同期制御フロー
  • [雑記] スレッド プールとタスク(C# によるプログラミング入門)

    概要 Ver. 4.0 C# 3.0 で導入されたラムダ式と、 .NET 4 で導入された Task、Parallel、ParallelEnumerable などのクラスを使うことで、 非同期処理や並列処理が簡潔に記述できるようになりました。 また、C# 5.0 では非同期処理用の新構文が追加される予定です。 参考: 「非同期処理」 このページでは、これら非同期処理の基礎となる Task クラスや、その背後にあるスレッド プールというものについて説明していきます。 ポイント スレッドはそれなりに高コストなので使い回しをしたい → スレッド プール。 スレッド プールを使った非同期処理を行うには、.NET Framework 4 で導入された Task クラスが便利です。 スレッドを使った非同期処理を行いたい動機としては、以下の2つが挙げられます。 非ブロッキング処理: I/O 待ちとかで

    [雑記] スレッド プールとタスク(C# によるプログラミング入門)
  • foreach

    ここでは詳細には触れませんが、 当サイト上にある「C++ STL」や「アルゴリズムとデータ構造」でもコレクションについて簡単な説明がありますので、興味のある方はそちらをご覧ください。 また、コレクションについてより詳しく知りたい方は検索エンジンで「データ構造 アルゴリズム」などをキーワードにして検索してみてください。 ここでは例として連結リストを示します。 あくまで例として示すだけなので、単純な実装方法を取っています。 (来はもう少しちゃんとした実装の仕方をしないとだめ。) using System; using System.IO; /// <summary> /// リストのノード /// </summary> class Node { public int elem; public Node next; public Node() : this(0, null){} public

    foreach
  • XAML の高度な機能(WPF)

    依存プロパティ 「基構造」では、 XAML 中の XML タグの属性や子要素を通して、 クラスの「プロパティ」の値を設定できると説明しました。 これはより正確にいうと、 「普通のプロパティも使える」となります。 WPF では、通常のプロパティでは実現できない機能を実装するために、 依存プロパティ(dependency property)というものを用意しています。 XAML では、 通常のプロパティと同名の依存プロパティがある場合、 依存プロパティの方が優先されます。 (依存プロパティと区別する目的で、 通常のプロパティを「CLR プロパティ」と呼んだりもします。) 依存プロパティを使いたいクラスは DependencyObject クラスを継承する必要があります。 DependencyObject は、SetValue と GetValue というメソッドを持っていて、 以下のようにし

    XAML の高度な機能(WPF)
  • ++C++; //未確認飛行 C

    using System; class Welcome { /// <summary> /// saying hello to all visitors and welcome. /// </summary> public static void Main(string[] args) { foreach(string visitor in args) { Console.Write("Hello {0}.\n", visitor); } Console.Write("Welcome to my web page.\n"); } } C:\WINDOWS\desktop\welcome>nmake -nologo csc /out:welcome.exe /nologo welcome.cs C:\WINDOWS\desktop\welcome>welcome Welcome to my