考えられるC#の革新





マイクロソフトは最近、コミュニティとのコミュニケーションを図り、できるだけ多くのレビューを受け取り、それらを実践しようとしていることに注意してください。 このmodとC#開発チームはバイパスしていません。 言語の新しいバージョンの開発は、確実に密室ではありません...



Mads Torgersen によるC#7.0の新機能というタイトルの記事は、すでに広く解析されています。 しかし、それに言及されていないものがあります。



Roslynリポジトリからのいくつかの提案をご覧になることをお勧めします。 トピックタイトルC#7機能の作業リスト 。 情報は数か月前に更新されました(つまり、あまり重要ではありません)が、これは間違いなくMads Torgersenの注意を奪われなかったものです。



2回でも、「強い関心」と「非言語」のセクションで、次の文が言及されています。



1.コンパイラ#5561のコード生成拡張機能を有効にします

2.代替修飾子を追加して、より多くのツール生成コードシナリオを有効にします#5292



実際、これはアスペクト指向プログラミング機能をC#に追加するための提案です。 短縮形の本質を伝えようとします。



コンパイラーのコード生成拡張機能の追加



githubでは、この提案が開発中としてマークされていることに注意してください。 コードインジェクターで重複コードを取り除くことをお勧めします。 コンパイル時に、特定のコードがコンパイラによって自動的に追加されます。 重要なこと:ソースコードは変更されず、バイナリファイルへのコンパイル後にコードの実装は発生しません。



この説明は、インジェクターを作成するプロセスが診断アナライザーを作成するプロセスに似ていることを示しています。 すべてがもっとシンプルになることを願っています(この場合、クラスは手動で作成および編集できます)。 しかし、コードを自動的に生成するツールの助けを借りてのみこれを行うことが便利になる可能性があります。



次に、プロジェクトの各クラスに新しいフィールド、ClassNameという名前の文字列型定数、およびこのクラスの名前を含む値を実装するクラスの例を示します。



[CodeInjector(LanguageNames.CSharp)]
public class MyInjector : CodeInjector
{
    public override void Initialize(InitializationContext context)
    {
        context.RegisterSymbolAction(InjectCodeForSymbol);
    }

    public void InjectCodeForSymbol(SymbolInjectionContext context)
    {
        if (context.Symbol.TypeKind == TypeKind.Class)
        {
            context.AddCompilationUnit($@"partial class {context.Symbol.Name} 
                      {{ public const string ClassName = ""{context.Symbol.Name}""; }}");
        }
    }
}

      
      





- , . , , , INotifyPropertyChanged.



INotifyPropertyChanged ? PostSharp Walkthrough: Automatically Implementing INotifyPropertyChanged

. , , PostSharp IL (How Does PostSharp Work). , IL .



, .



, INotifyPropertyChanged. Name, :



class Employee: INotifyPropertyChanged
{
 private string _name;
 
 public string Name
 {
    get { return _name; }
    set 
    {
       _name = value;
       RaisePropertyChanged();
    }
 }
 
 private void RaisePropertyChanged([CallerMemberName] string caller="")
 {
    if( PropertyChanged != null )
    {
       PropertyChanged(this, new PropertyChangedEventArgs(caller));
    }
 }
}

      
      





:



[INoifyPropertyChanged]
public class Employee
{
   public string Name { get; set; } 
}

      
      





, , INPC INoifyPropertyChanged. :



public class EmployeeINPC
{
   public string Name { get; set; } 
}

      
      





.



Superseding members — ,



, , supersede.



, :



//   
public partial class MyClass
{
      public void Method1()
      {
          // -   
      }
}

//   
public partial class MyClass
{
      public supersede void Method1()
      {
           Console.WriteLine("entered Method1");
           superseded();
           Consolel.WriteLine("exited Method1");
      }
}

      
      





Method1, Method1, . Method1 . , superseded. , , Method1.



, INotifyPropertyChanged :



//   
public partial class MyClass
{
     public int Property { get; set; }
}

//   
public partial class MyClass  : INotifyPropertyChanged
{
     public event PropertyChangedEventHandler PropertyChanged;

     public supersede int Property
     {
          get { return superseded; }
          set
          {
              if (superseded != value)
              {
                    superseded = value;
                    var ev = this.PropertyChanged;
                    if (ev != null) ev(this, new PropertyChangedEventArgs("Property"));
              }
          }
     } 
}

      
      





superseded , .



Main



github, . Main await. , , :



static async Task DoWork() {
    await ...
    await ...
}

static void Main() {
    DoWork().GetAwaiter().GetResult();
}

      
      





. DoWork().Wait() AggregateException.



CLR , main , async Main.



. . , .






, C# 7.0, , 8.0, .



Visual Studio 2017 Task-like return types for async methods, 7- .



GitHub .



All Articles