12

面白いアイデアがあります。ifキーワードをMyIfまたは他のものに置き換えるなど、C#でキーワードを再定義したいと思います。誰かがそれを行う方法について何か考えがありますか?

私はそれがこのように見える必要があると思うので:

namespace
{
   #define MyIf = if;
   #define MyElse = else;
   ...

   public someclass
   {
        public void someMethod()
        {
            MyIf(true)
            {
               ...
            }
            MyElse
            {
               ...
            }
        }
   }
}

追加した:

たぶん、C#の標準コアの一部を再定義するC ++またはCライブラリを作成する方法はありますか?

**知らせ。私はそれが悪いプログラミング慣行であることを知っています、そして私はすべてのプログラマーにあなたのエンタープライズコードで答えを使わないように頼みます。**

4

7 に答える 7

5

それは不可能です。C# には C や C++ のようなプリプロセッサがないため、コンパイラがソースを認識する前にソースを変換するメカニズムがありません。もちろん、コンパイラは標準のみを認識するifため、コンパイラがソースを認識する前に何らかの方法でソースを変換する他のオプションもありません。

仮にそれが可能だったとしても、ホラースケールではクトゥルフの一歩下に過ぎません。

于 2013-03-04T08:54:45.557 に答える
3

C# では、オーバーロード可能な演算子 ( +-== )をオーバーライドできます

しかし、条件演算子を実際にオーバーライドすることはできません。

これらの演算子 =、.、?:、->、new、is、sizeof、typeof についても同様で、オーバーロードできません。

C# はマクロをサポートしていませんが、最終的にコードを C# コンパイラに送信する前に、マクロを処理するカスタム パーサーを作成することもできます。Microsoft Roslynを参照してください。

http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx

于 2013-03-04T08:57:29.390 に答える
2

モナドextension methods次のように使用できます...

これはモナドかな

    public static TInput If<TInput>(this TInput o, Predicate<TInput> evaluator)
        where TInput : class
    {
        if (o == null) return null;
        return evaluator(o) ? o : null;
    }

        public static TResult Return<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator, TResult failureValue)
            where TInput : class
        {
            if (o == null) return failureValue;

            return evaluator(o);
        }

// 使用

var result = ListOfObjects.If(o => o.Id == 1).Return(x => x.Object, null);
于 2013-03-04T09:09:31.703 に答える
1

iforを再定義することはできませんelse。C# には、そのようなことを可能にするプリプロセッサがないためです (おそらく、誰かがそのようなことをするのを防ぐためでもあります)。

ただし、クラスのインスタンスがtrue/に評価されるタイミングを再定義できますfalse(取得できる最も近い値です)。

public static bool operator true(YourType x)
{
    return x.IsLying ? !x.Whatever : x.Whatever;
}

public static bool operator false(YourType x)
{
    return x.IsLying ? x.Whatever : !x.Whatever;
}

例:

YourType wah = new YourType() { IsLying = true, Whatever = true };
if (wah) {
    // ...
}
else {
    // ...
}

詳細については、こちらを参照してください:
http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx

于 2013-03-04T08:56:58.093 に答える
1

C# #define

#define を使用すると、#if ディレクティブに渡される式としてシンボルを使用することにより、式が true と評価されるように、シンボルを定義できます。

C# にはpreprocessorはありませんが、同様のディレクティブがあります。

コンパイラには個別のプリプロセッサはありませんが、このセクションで説明されているディレクティブは、プリプロセッサがあるかのように処理されます。これらは、条件付きコンパイルを支援するために使用されます。C および C++ ディレクティブとは異なり、これらのディレクティブを使用してマクロを作成することはできません

したがって、C++ や C の #define と同じではありません。C# の #define は、リテラルが存在することを示すだけで、そのリテラルの置換またはマクロはありません。

#define STRING int // Valid in C++ but invalid in C#

C++ #define

#define ディレクティブは、ソース ファイル内の後続のすべての識別子を token-string に置き換えます。識別子は、トークンを形成する場合にのみ置き換えられます。(C++ 言語リファレンスの C++ トークンを参照してください。) たとえば、identifier は、コメント内、文字列内、または長い識別子の一部として表示される場合、置換されません。

于 2013-03-04T09:00:25.863 に答える
0

C# では、条件付きコンパイル コード用のプリプロセッサ ディレクティブがあります。

例えば:

#define シンボルを定義できます。#ifディレクティブに渡される式としてシンボルを使用すると、式は true と評価されます。

于 2013-03-04T08:59:22.957 に答える
0

必要に応じて、暗黙のブール演算子をオーバーライドできます。

using System;

class PleaseDontDoThis {
    public static implicit operator bool(PleaseDontDoThis h) {
        return (new Random().Next() % 2 == 0);
    }
}

static class Program {
    static void Main(string[] args) {
        var x = new PleaseDontDoThis();
        if (x) {
            Console.WriteLine("true");
        } else {
            Console.WriteLine("false");
        }
    }
}
于 2013-03-04T09:00:25.670 に答える