タグ

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

  • .NET Core 3.0 をもって .NET Framework からの移植作業は完結

    corefx で以下のようなアナウンスが。 .NET Core 3.0 concludes the .NET Framework API porting project buildの時点で .NET を .NET Core ベースに一化、.NET Framework は 4.8 をもって最後にするという話があったわけですが、 改めてというか、総括的なアナウンスです。 API 数 まず、.NET Framework から .NET Core に移植してきた API 数の総括。 メソッドのオーバーロード1個1個を「1 API」とカウントしてるんだともいますが、以下のような数字が書かれています。 .NET Core 1.0 時点では1.8万個 .NET Standard 2.0 では .NET Framework、.NET Core、Xamarin の共通部分として3.8万個 Windows

    .NET Core 3.0 をもって .NET Framework からの移植作業は完結
    ghostbass
    ghostbass 2019/10/15
    WebFormsなんてなんで作っちゃったんだろ。
  • C# で、同じソースコードから常に同じバイナリを生成する

    昔、gist にだけ置いてて、そういえばブログに書いてなかったものを思い出したので書いておくことに。 (一応、部分的には言及したことがあるんですけど、ちゃんとした話はしたことがなかったはず。) 決定論的ビルド 3年くらい前まで、C# コードをコンパイルすると、ソースコードを一切書き換えていなくても、生成結果の exe/dll や pdb のバイナリが変化していました(決定性(deteminism)がない)。 原因は以下の2つです。 バイナリ中に埋め込まれる GUID にタイムスタンプと乱数から生成される値を使っていた デバッグ用のファイル情報がフルパスで埋め込まれていた GUID の方はタイムスタンプと乱数なので当に致命的で、ローカルで再コンパイルしても毎回バイナリが変化していました。 フルパスの方は基的には pdb (デバッグ用シンボル情報)だけの問題なんですが、 exe/dll で

    C# で、同じソースコードから常に同じバイナリを生成する
    ghostbass
    ghostbass 2019/05/25
    覚えておく
  • Visual Studio 2015でのC#/VBの文字コード

    VSサポートチームのブログ記事が上がったことによって少々話題になっていますが、文字コード問題。 Visual Studio 2015 で Shift JIS エンコーディングされたソース ファイルをビルドするとコンパイラ エラーが発生する場合がある 症状 Shift JIS とか、Unicode 以前の各国文字コードで保存した C#/VB ファイルがコンパイルできない、できても文字列リテラルが狂うなどの問題が出ます。 日に限らず、中国語圏とかでも話題に。 原因 Roslynのせいではあります。 ぶっちゃけ、「by design (仕様です)」の類ではあったんですが。 クロスプラットフォーム対応のためにEncoding.Defaultを使うのをやめたというのがこの問題の原因です。 経緯を追って CoreFx 対応 最初にEncoding.Default撤廃をやったのは以下のpull req

    Visual Studio 2015でのC#/VBの文字コード
    ghostbass
    ghostbass 2015/10/19
    BOM付UTF-8って結構鬼門に入りそうな/ SourceMonitorがutf-8対応していると思いきや微妙にずれているっポイので面倒くさい
  • ピックアップ Roslyn 9/6

    Array.Empty 最適化 .Net 4.6 optimizations breaking on 4.5.2 servers #4889 Roslyn(C# コンパイラー)の問題か、msbuild(ビルド ツール)の問題化、JIT レイヤーに持っていくべき問題かとかいろいろたらいまわしになりそうな話。 Roslyn がやったこと まず、何をやろうとして問題が起きてるのか。 params 引数に対して何も引数を渡さなかったときに、C# コンパイラーが内部的に空の配列を作って引数に渡します。この時、Roslyn を使って .NET 4.6 以降をターゲットにすると、生成されるコードが少し変わります。 new StringBuilder().AppendFormat("") みたいなのを書くと、実際に生成されるコードは、 旧コンパイラー/古い .NET: new StringBuilder(

    ピックアップ Roslyn 9/6
    ghostbass
    ghostbass 2015/10/05
    non nullableって結構インパクトでかいな。とりあえずnullにして条件により生成方法変えるとか結構やってる・・・factoryとか頑張るしかないか
  • 使わなくなった機能・新しい機能

    概要 C# も .NET Framework (のライブラリ)も、ずいぶんと進歩してきました。 その結果、一部の構文やライブラリは、別のもので置き換えられる/置き換えた方がいいものも出てきています。 過去の遺物 いくつかの構文は、もう完全に過去のものです (互換性のためだけに残されています)。 非ジェネリック コレクション ポイント: 非ジェネリック版のコレクションは使ってはいけない。 C# 2.0 で 「ジェネリック」 が導入されると同時に、ジェネリック版のコレクションが導入されました。 それ以前の、非ジェネリック版のコレクションを使うメリットは一切ないので、使わないようにしましょう。 非ジェネリック版からジェネリック版で、名称が変わっているものもあるので気を付けましょう。 「ジェネリック版に、ArrayList 相当のものがない」という誤解もあったりしますが、List<T> がこれに相

    使わなくなった機能・新しい機能
    ghostbass
    ghostbass 2012/03/08
    foreachを使ってもらえません。どうすれば良いでしょうか。
  • [雑記]動的な処理の使い方

    概要 プログラミング言語の区分として、静的(static)か動的(dynamic)かというものがあります。 ただ、動的と言っても、何を動的に行うか、いろんなやり方があって、いろんな用途があります。 C# は「静的な言語」と呼ばれることが多いですが、正確には「静的な型を持つ言語」になります。 そして、型が静的でも、動的ローディングや動的コード生成など、色々な動的処理を行えます。 ここでは、C# でできる動的処理と、その用途について説明して行きます。 動的ローディング 既知の型を、未知のDLLから読み込みます。 例えば、図1のような感じ。 System.Reflection.Assembly クラスの Load メソッドなどを使って DLL を読み込んで、 System.Activator.Create メソッドでインスタンスを作ります。 動的ローディング。 通常の(静的な)コードと比べて、

    [雑記]動的な処理の使い方
  • [サンプル] 透過プロキシ

    概要 「実行時型情報」のサンプルがちょっと不足してるなぁと思って作ったもの。 .NET Framework では、RealProxy というクラスを使って、 インターフェースのメソッド呼び出しを横取りして独自の処理に置き換えることができます。 ソース一式(ZIP 形式) RealProxy 例えば、マルチキャストデリゲートのようなことをインターフェースのメソッド呼び出しに対して行うようなプロキシ。 RealProxy クラスを継承して、Invoke メソッドをオーバーライドするだけ。 public class MulticastProxy<Interface> : RealProxy { public MulticastProxy(params Interface[] interfaces) : base(typeof(Interface)) { this.interfaces = new

    [サンプル] 透過プロキシ
    ghostbass
    ghostbass 2010/08/06
    やっぱりデリゲートだな…
  • 可変長引数

    概要 C# では params キーワードを用いることでメソッドの引数の数を可変にすることが出来ます。 ポイント 定義側の例:int Sum(params int[] args) { ... } 利用側の例:Sum(1, 2, 3, 4, 5);… これで、Sum(new int[] { 1, 2, 3, 4, 5 });と同じ意味。 params キーワード 例えば、可変個の整数のうち最大の整数を求めるメソッドを作りたいとします。 可変長引数を使わずにメソッドを実装すると以下のようになるでしょう。 using System; class ParamsTest { static void Main() { int a = 314, b = 159, c = 265, d = 358, e = 979; // ↑こいつらの最大値を探したいとき、 int[] tmp = new int[]{a

    可変長引数
  • 1