20220114のC#に関する記事は3件です。

C#10.0のコードがVisual Studio 2022でビルドできない場合はMicrosoft.Net.Compilers.Toolsetのせい

言語バージョンを更新したらビルドできない! VS2019で作成したソリューションのプロジェクトはデフォルトで以下の設定になります。 ターゲットフレームワーク:net5.0 言語:C# 9.0(latest) VS2019で作成したソリューションとプロジェクトは、.slnファイルや.csprojファイルの中身の構造がVS2022では変更されませんでしたのでVS2022でそのまま開くことが可能です。 しかし、この状態でうきうきでC#10.0のglobal usingやfile scoped namespaceに書き換えを行っても、「{が必要です」といった基本的な文法エラーで殴られてビルドが通らないことがあります。アイエエエ!?CS1513!?CS1513ナンデ!? (以下、うきうきで変更したら怒られたときの画面) 上図をよく見たらわかるのですが、実はVS2022のエディタはエラーだと思っていない(問題は見つかりませんでしたとか言ってる)のにビルド時にエラーになってます。 ついでにCS8032で「アナライザー System.Text.Json.SourceGeneration.JsonSourceGenerator のインスタンスは C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\analyzers\dotnet\cs\System.Text.Json.SourceGeneration.dll (ファイルまたはアセンブリ 'Microsoft.CodeAnalysis, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。) から作成できません。」とか言われて警告ビンタされます。 本稿ではこれの原因と対処法について説明します。 原因はSourceGeneratorとかに使うMicrosoft.Net.Compilers.Toolset 結論からいうとMicrosoft.Net.Compilers.Toolsetを参照しているプロジェクトはこのライブラリのバージョンを更新しないとビルドが通りません。 こいつの説明に答えが書いてあります。 .NET Compilers Toolset Package. Referencing this package will cause the project to be built using the C# and Visual Basic compilers contained in the package, as opposed to the version installed with MSBuild. 以下、google翻訳 .NETコンパイラツールセットパッケージ。 このパッケージを参照すると、MSBuildでインストールされたバージョンではなく、パッケージに含まれているC#およびVisualBasicコンパイラを使用してプロジェクトがビルドされます。 そんな仕様だったの!?という感じではありますが、.csprojファイルで設定したターゲットフレームワークやLangVersionよりも優先してMicrosoft.Net.Compilers.Toolsetに内蔵されたRoslynコンパイラが動作する、というわけです。RoslynコンパイラのバージョンはMicrosoft.Net.Compilers.Toolset.dllによって決まります。このため、dllのバージョンが古いとC#10より前のコンパイラでビルドされるのでビルド時にエラーが出るというわけです。エディタのエラー検出に使うコンパイラはおそらく.csprojの設定に依存して決まるのでしょう。多分。 dllのバージョンとRoslynコンパイラのバージョンの対応 MSDNに対応表があります。2022/01/14時点では3.xまでしか表がありません(英語サイトも)が、そのうち追加されるでしょう。 Roslyn パッケージ バージョン サポートされている Visual Studio の最小バージョン 3.x Visual Studio 2019 2.10.0 Visual Studio 2017 バージョン 15.9 2.9.0 Visual Studio 2017 バージョン 15.8 2.8.2 Visual Studio 2017 バージョン 15.7 2.7.0 Visual Studio 2017 バージョン 15.6 2.6.1 Visual Studio 2017 バージョン 15.5 2.4.0 Visual Studio 2017 バージョン 15.4 2.3.2 Visual Studio 2017 バージョン 15.3 2.2.0 Visual Studio 2017 バージョン 15.2 2.1.0 Visual Studio 2017 バージョン 15.1 2.0.0 Visual Studio 2017 RTM 1.3.2 Visual Studio 2015 更新プログラム 3 1.2.2 Visual Studio 2015 更新プログラム 2 1.1.1 Visual Studio 2015 更新プログラム 1 1.0.1 Visual Studio 2015 RTM 私のプロジェクトでは3.11.0を使っていました。そりゃビルドが通らんわ・・・というわけでUpdate-Packageを実行すればビルドが通ったのでした。 なお、記事作成時点では最新バージョンは4.0.1になります。 あとがき 初めてC#を触ったときから「namespaceなんて99%はファイル全体で同じなのになんでインデントせにゃいかんの?」と思っていたのが、C#10.0でようやく解消できます。ずいぶん待たされましたし、file scoped namespaceが導入される理由が「HelloWorldの簡略化」みたいなとこがありますが、これが嫌だったのは私だけだったんでしょうか? 他にもC#10やNET6にはたくさんの機能追加があります。特にLINQのMaxBy,MinByは待望の機能ではないでしょうか?みなさんもぜひ最新バージョンへのアップデートを行いましょう!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonの実行速度比較

初めに Pythonが実行環境によってどれくらい速度差があるのかを調べてみました(ついでにC#も)。 実行マシン 機種 CPU RAM Video Python C# mac mini 2018 Intel Core i5 3GHz 6c 16GB 内蔵Chipset 3.8.9 venv .NET Core 6.0.101 コード 辞書に1000万回数字を書き込むだけのコードです。例: ct['1000'] = 1000 main.py import time ct = {} t1 = time.time() for i in range(0, 10000000): ct[str(i)] = i t = time.time() - t1 print("Time={0}".format(t)) Program.cs using System.Collections.Generic; var ct = new Dictionary<string, uint>(); var sw = new System.Diagnostics.Stopwatch(); sw.Start(); for(uint i=0; i<10000000; i++) { ct[i.ToString()] = i; } sw.Stop(); TimeSpan ts = sw.Elapsed; Console.WriteLine($"{ts}"); 結果 Python 環境 実行時間[秒] 備考 nuitkaでビルドしたバイナリ 3.67 nuitka3 main.py --onefileファイルサイズ6.4MB ターミナルで実行 5.07 python main.py VSCodeのターミナルで実行 5.25 python main.py VSCode・Breakpointなしでデバッグなし実行 5.27 Ctrl-F5 VSCode・Breakpointなしでデバッグ実行 5.67 F5 VSCode・Breakpointありでデバッグ実行 40.86 F5Breakpointは最終行に設置 C# 環境 実行時間[秒] 備考 Release Build 1.92 ターミナルで実行 2.13 dotnet run VSCode F5 2.19 C#のDictionaryをHashtableに変更したもの 環境 実行時間[秒] 備考 ターミナルで実行 13.98 dotnet run Release Build 14.00 VSCode F5 14.66 まとめ 1) Python バイナリが最速だったがインタプリタ実行と2倍も変わらなかった(1.38〜1.55倍)。 「Breakpointありのデバッグ実行」はめっっっっっちゃ遅い。ループをぶん回すような処理のデバッグにはご注意ください。 2) C# 表には記載していないがBreakpointの有無による差はなかった(すごくない?)。 同じような用途でもクラスを間違えるとパフォーマンスにえらい差が見られた(例: DictionaryとHashtable)。 Pythonより速いが、起動時間に数秒かかるので実際の時間は表の数値より大きい。起動時間こみで計測してみると以下のようにPythonとC#でほぼ一緒だった(もちろん、プログラムが完成したらいちいちビルドする必要がないのでdotnet runではなく実行ファイルを直接起動すれば良いのだが開発中の待ち時間の方が気になりますよね?)。 time python main.py ---> 5.35秒 time dotnet run ---> 5.18秒
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C++,C#のコメントアウトテクニック

概要 下記のような記載が出来る言語で使えるコメントアウトのTips 使える言語の参照 main.cpp // 1行コメント /* 複数行コメント 複数行コメント */ 内容 複数行コメントを1文字で切り替える 先頭のスラッシュ(/)を消すと切り替えれる main.cpp //* 現在の 複数行コメントは コメントアウトされない //*/ /* 現在の 複数行コメントは コメントアウトされる //*/ 機能の切り替えを1文字で切り替える 上記のIF版で 先頭のスラッシュ(/)を消すと切り替えれる main.cpp //* Active Block /*/ Disable Block //*/ /* Disable Block /*/ Active Block //*/ まとめ C++er には多少有名なのでN番煎じではあるもののいろいろな言語で使えるので書いてみました。 C++では#if #endifで切り替えたりしますが、プリプロセッサで簡単に切り替える機能がない言語だと使いみちはありそうです。 後1文字切り替えなので楽ですが、可読性が良いとは言えないので過度な利用は控えたほうが良さそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む