C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2011/03/22 00:03

C#と諸々 ローカル変数に参照渡し

ローカル変数に参照渡しはできないけれど、参照を扱うことはできるということに気付きました。
実は C# には隠しキーワードがいくつかあって、その内の __makeref と __refvalue を使うことで参照を扱うことができます。

using System;
class Program
{
    static void Main()
    {
        int v0 = 0;
        TypedReference r0 = __makeref(v0);
        __refvalue(r0, int) = 5;

        Console.WriteLine(v0); //=> 5
    }
}


スポンサーサイト



タグ: .NET C#
2011/03/21 01:54

SpecialNameAttribute クラス (System.Runtime.CompilerServices)

最近見っけた。
これ使うとメソッドやフィールドに IL レベルで specialname 修飾子を付けれる。

using System;
using System.Runtime.CompilerServices;

class Hoge
{
    public Hoge(string value)
    {
        _value = value;
    }

    private string _value;

    [SpecialName]
    public static string op_Explicit(Hoge obj)
    {
        return obj._value;
    }
}

こうすれば普通のメソッド定義と同じ形式で演算子のオーバーロードができる。
けど、同一プロジェクト内からは演算子として呼び出すことはできなくて、静的メソッドとして呼び出す必要あり。

これを使って何か面白いことできないかなーとか考えてたんだけど・・・無い!
.ctor なんて名前のメソッドは定義できないからコンストラクタは作れないし、get_XXX とか set_XXX とか add_XXX とか remove_XXX なんてメソッド作ったところでプロパティやイベントになるわけでもなし。まぁできたところで・・・何も面白くない。
interface との変換演算子とかジェネリックな変換演算子なんて作ってみたけどコンパイラが認識しないから実行されず。

強いて言えば C++/CLI で使える非静的な演算子を用意したりできるけど・・・無意味すぎ。

タグ: .NET C# CLR
2011/03/21 01:50

struct Hoge
{
    public void Clear()
    {
        this = new Hoge();
    }
}


ちょっと驚きましたが、よくよく考えると出来て当然ですね。

タグ: .NET C#
2011/03/09 01:13

Java/.NETアーキテクトを見分ける10の質問 ( by @yfakariya ) - 猫とC#について書くmatarilloの日記

おかしなところあったら誰か突っ込みお願いします。。。


1. try-catch-finally が try-catch および try-finally について不適切である理由を述べよ(try-catch-finally のほうが多くの場合適切であると思う場合はその理由を述べよ)
どれが適切かはケースバイケース。
try-catch のスコープはできるだけ狭くすることが推奨されるため、それに従うと try-catch-finally よりも、try-finally の中に try-catch がネストされることが多くなる。が、個人的にはキャッチ対象の例外が他にスローされる可能性がないのならば、スコープを広げて try-catch-finally を使用しても良いと考える。

2. Unicode で制御文字を検出する正規表現を記述せよ。
[^\d\w\s]
自信がなかったので PowerShell で検証したけど問題なさそうかな。。。

3. UTC 時刻とローカル時刻のメリットとデメリットについて説明せよ。
UTC 時刻はロケール非依存のため世界共通で使用できるが、直観的ではない。
ローカル時刻は直観的であるが、ロケール依存のため世界共通で使用できない。

4. 基底クラスとインターフェイスの使い分けについて述べよ。ただし、セマンティクスとバージョニングの観点は必ず含めること。
ユーザーが実装するべき型に対して、概念的に汎化しているのならば基底クラス。
ユーザーが実装するべき型に対して、規約を表すのならばインターフェイス。

バージョニングってのは、、、基底クラスならば型を拡張する際に仮想メソッドとすることでユーザー側の対応を必須にせずに済む、ってことかな…?使い分けの基準にはしないなぁ。。。

5. Windows NT と Linux それぞれにおいて、ファイルのアップロードプログラムのセキュリティのためのアクセス権およびユーザー権限の設定について述べよ。
次のような要件を想定。
・アプリケーション形態:Web Application (イントラネット)
・認証方式:Windows 認証
・ファイルの格納方法:ファイルシステム
・アップロード許可範囲:限られたユーザーのみ

この場合、グループを作成し、そのグループに対して Write のアクセス権を付加。アップロードを許可するユーザーはそのグループに所属させる。

Linux はさっぱり。

6. 分散環境における同期呼び出しと非同期呼び出しについて、それぞれの利点と欠点を上げ、比較せよ。
同期呼び出しはシンプルに処理できるが、処理中の空きリソースが無駄。
非同期呼び出しはリソースを有効的に使用できるが、結果を受け取る必要がある場合は処理が複雑になりがち。

7. Web AP のスケーラビリティを向上させるための方法を 3 つ以上上げよ。必要であればまだ未リリースの技術を使用しても構わない。
・ロードバランサー
・Key-Value ストア
・分散処理フレームワーク

8. TCP/IP プロトコル上で WS-Reliable Messaging を採用する意義を述べよ。
TCP/IP はプロトコルレベルでは信頼性を保証しないけれど、WS-Reliable Messaging を採用することで信頼性を保証できるようになる。

9. MVC パターンの目的、メリット、デメリットを述べよ。
テスト容易性や保守性が向上する。
MVC パターンを想定して作られていない高機能 UI コントロールとの相性が悪い場合がある。

10. レイヤーアーキテクチャの欠点と適用すべきでない事例をあげよ。
レイヤーアーキテクチャをドメインモデル主体の3層構造として。
欠点としては、仕様として扱うデータの種類が増えた場合、全レイヤーに影響が出る。
適用すべきでない事例は、ドメインロジックをほぼ持たず、画面上の項目とデータベース上の項目がほぼ一致する単純なデータ管理システム等には適用すべきではない。

タグ: .NET
2011/03/07 13:22

「C#できます」と言い放ったあいつがJavaプログラマであることを見分ける10の質問 - 猫とC#について書くmatarilloの日記

仕事で C# 使わなくなって久しい僕なので、あまり自信ないけど…。


* ==演算子のオーバーロードを実装してEqualsメソッドと同じ処理を実行するようにしてもよい場合はどのような時か?
同値であるオブジェクトを同一であるとして扱う場合。

* ループ内でなければ、たとえ100個の文字列型変数であってもまとめて+演算子で連結してよい理由を説明せよ。
+演算子が99回繰り返されるのではなく100個の文字列を一つにまとめるという処理に最適化されるため。

* List<int>のように値型を格納するジェネリックコレクションを使ってもボックス化/ボックス化解除が発生しない理由を説明せよ。
実行時に、要素の型が内部的にも object 型ではなく実際のジェネリック引数の型で置換されて動作するため。

* Full GC(Gen2 GC)が動作したときに断片化していてもコンパクションされないヒープ領域はどのような領域か?
ラージオブジェクトヒープと呼ばれる、一定サイズ以上のサイズを持ったオブジェクトが配置される領域。

* throw; とthrow ex; の違いをスタックトレースの観点で説明せよ。
前者は catch するまでのスタックトレースを維持するが、後者はその時点からのスタックトレースで上書きされる。

* フィールドのアクセス修飾子をprivateにしプロパティのgetter/setterではそのフィールドを読み書きするだけというコードが馬鹿馬鹿しい理由を説明せよ。
プロパティで単一フィールドの読み書き以外を行わない場合、自動プロパティが使用できるため。

* nullを参照している参照型変数のメソッドを呼び出そうとした場合でもNullReferenceExceptionが発生しないのは主にどういう状況か?
第一引数が null であっても NullReferenceException が発生しない拡張メソッドである場合。

* クラスと構造体の違いは何か?(「スタックとヒープ」以外で)
全部「スタックとヒープ」に起因するけど、次のような違いがある。(スタックとヒープに起因しないものあるっけ?)
・継承できない
・ユーザー定義のデフォルトコンストラクタとファイナライザを用意できない
・== 演算子、!= 演算子がデフォルトでは用意されていない
・object や interface にキャストするとボックス化が生じる

* デストラクタとは何か?
オブジェクトが破棄される際に呼び出される特殊なメソッド。C# ではファイナライザと呼ぶ。

* インターフェースの明示的実装を利用する目的を1つ説明せよ。
対象のインターフェイスを意識していないコードから無闇に呼び出せないように隠蔽する。



タグ: .NET C#
2011/03/05 23:38
C#と諸々 もし最初から拡張メソッドがあったら

こんな感じ。

class Hoge
{
}

class Fuga : Hoge
{
}

class Piyo : Hoge
{
}

class Program
{
    static void Main(string[] args)
    {
        var hoge1 = new Hoge();
        var hoge2 = new Hoge();
        var fuga1 = new Fuga();
        var fuga2 = new Fuga();
        var piyo  = new Piyo();

        bool b1 = hoge1.Equals(hoge2);      // T = Hoge
        bool b2 = hoge1.Equals(fuga1);      // T = Hoge

        bool b3 = fuga1.Equals(fuga2);      // T = Fuga
        bool b4 = fuga1.Equals(hoge1);      // T = Hoge (!!)

      //bool b5 = fuga1.Equals(piyo);       // Build Error !!
        bool b6 = fuga1.Equals((Hoge)piyo); // T = Hoge
        bool b7 = fuga1.Equals<Hoge>(piyo); // T = Hoge
    }
}


[検証プログラム]
インテリセンスに Object.Equals(object) が出てこないこと、Equals の引数の型が自分自身になることを確認できます。
ビルドが出来るだけで実行は出来ません。

ダウンロードページ


2011/03/05 02:08
Equals メソッドの引数の型は自分自身の型にできたんじゃなかろーか。

public class Object
{
    protected internal virtual bool Equals(object obj)
    {
        ...
    }
}

public static class ObjectExtension
{
    public static bool Equals<T>(this T source, T obj)
    {
        if (source == null)
        {
            // return (obj == null); にするのも面白い
            throw new NullReferenceException();
        }
        return source.Equals((object)obj);
    }
}


あまり深く考えずに言っているので、なんらかの不都合が生じるかもしれないけど。。。
つか、拡張メソッドのサポートを全ての言語に強いることになるからダメかな。
つかつか、やっぱし自分自身の型を示すキーワードが欲しくなる。