投稿

[C#]Generic indexersが欲しい

突然ですが、ふとこんなコードを
T Get(string key) { ... }
こんな風に
T this[string key] { get { ... } }
書きたくなったことありませんか?
私はあります。generic methodをgeneric indexerにできるだろうと、試してみるもコンパイルエラー。

比較的優秀なジェネリクスを持っているC#ならできるだろうと思ったりしますができません。

いちおうRoslynのほうにIssueは上がってたりします。

が、どうもCLRに変更を加える時に盛り込みたいような内容で、csharplangのほうにIssueとして、リストアップされてます。

interfaceのデフォルトメソッド対応の時に盛り込まれればラッキーみたいな内容ですが、盛り込まれるかどうかもわからないので、当分はgeneric methodで我慢ですね。。。

[C#]コンストラクタで参照渡しできた話と出力変数宣言できるようになる話

よく++C++; // 未確認飛行 Cにはお世話になっていますが、その中のC#7.3新機能説明(式中での変数宣言をできる箇所の拡大)について、お恥ずかしながらよくわからないC#コードがあり、新たな発見をしたので、その報告をします。

式中での変数宣言(使える場所の拡充)
問題のコードを抜粋すると以下のようなものです
using System; class Derived : base { public Derived(int a) : base(out var x) { // base の場合でも同様。 Console.WriteLine(x); } }
このコンストラクタでのbaseの箇所""out var x""はなんなのか、当初はちっとも検討が付きませんでしたが、同僚の指摘によってどのようになってるかわかりました。

まず、上記のコードは基底クラスが省かれてるので同じような記述をすると以下のようになります。
class Base { // コンストラクタ public Base(out int a) { a = 10; } } class Sub : Base { // コンストラクタ public Sub() : base(out int a) { Console.WriteLine(a); // 10 } }
ここでBaseクラスのコンストラクタではint型の参照渡し(正確には出力引数)になっています。
気づきポイント①:コンストラクタでも参照渡しできた

そして、C#7.3では式中での変数宣言のできる箇所が拡大されたため、Subクラスのコンストラクタのbaseでは出力変数宣言になっています。
気づきポイント②:コンストラクタで出力変数宣言ができるようになった

ちなみにですが、Baseクラスのコンストラクタでは参照渡しの引数なので型の明示が必要ですが、Subクラスのコンストラクタでは出力変数宣言なのでvarによる型推論も可能です。




C#歴6年目ぐらいになりましたが、まだまだ知らない機能があってC#は勉強してて楽しいです。

Kotlinを学ぶにはC#を勉強したほうがいい(SequenceとLINQ)

タイトル半分ぐらい釣りです(半分大真面目)

最初に断っておきますが、Kotlinを勉強するのに必ずしもC#を勉強したほうがいいわけではありません、もちろんVB.NETでも概念は学べますし代替手段はいくらでもあると思います。

そこで、なぜC#を勉強したほうがというと単純に知見の数やKotlinはC#を意識しているとかいろいろありますが、自分がC#を推しているからです。

Sequence ところで、Kotlin使いの皆さんは本題のSequenceについてご存知でしょうか? 知らない方も多いかと思います。自分も1年ぐらい知りませんでした。
簡単に説明すると遅延実行するリスト操作関数です(Sequence自体はインターフェースです)。
遅延実行とはなんぞやって方はそのまま「C# LINQ 遅延評価」などでググってどうぞ。
そこで、「なぜSequenceがあるのか?Sequenceを使うと何が美味しいの?」というと単純に説明すると省メモリにできます(ツッコミどころのある説明だけどマサカリは飛ばさないで)。 このあたりの利点は「C# LINQ」などでググったらちらほらと見れるはずです。
「じゃあ、それなりに利点あるし使いたい!けど、わからない、どうやって勉強したらいいの?」 ってなりますよね? そこでC#のLINQ(正確にはLINQ to Objects)ですよ。 LINQ LINQというと.NETが提供する機能ですが、ほとんどの場合C#で用いているものを指していると思います。 そんなLINQですがWikipediaによるとVisual Studio 2008から対応しているらしいので、単純計算で10年近くの歴史があることになります。 Kotlinより歴史ありますよね?そういうわけで、今のところ知見的には同じような概念なので、KotlinのSequenceを学ぶならC#のLINQを学べばいいということになります。
ただし、KotlinのSequenceを学ぶためという用途ならば、学ぶのはLINQ to Objectsだけで十分かと思います。LINQは他にもLINQ to SQLなどがあります。 Reactive Extensions(Rx) LINQの話をするとこちらにも飛んできちゃいます、そうReactive Extensionsです。 他言語界隈の人ならRxのほうが身近な単…

[C#]配列はIListを実装していた

イメージ
小ネタ

はい、久しぶりのC#記事です。1カ月ぶりかな?その間にいろいろとネタは集めたのでちょっとずつ書き出していきます。

まずは、上の画像を見てください。

パターンマッチングでIList<string>してからstring[]が重複ケースで失敗しています。
これを逆にすると問題ないので、なんでだろうとcsharplangやRoslynのIssue眺めたりしてましたが、原因は結構単純でした。

https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/arrays/ から抜粋した画像です。
配列がIEnumerableとIEnumerable<T>を実装しているのはC#erとしてはかなり一般的なことかと思います。
自分もひょっとしたら配列のIEnumerableとIListのIEnumerableが衝突してるのかな~と考えてたりしましたが、なんと配列のIEnumerableの実装の仕方がアレでした。

https://docs.microsoft.com/ja-jp/dotnet/api/system.array?view=netframework-4.7.2

………

おいおいおいおい、IList経由で実装してたのかーーーい

そりゃパターンマッチングで重複ケースになるわけですよね。
また一つ勉強になりましたm(__)m

[Java]Project ValhallaはとてもC#を意識している

小ネタ

Javaのアップデート予定?方針?の一つのProject ValhallaでのJEP 218: Generics over Primitive Types、つまりジェネリクスでプリミティブ型=>値型のサポートを強化しようというもの(ざっくりした説明)においての話です。

ページを見てもらえばすぐわかりますが、かなりC#, .NETのことを意識しています(笑)
あとScalaやC++もですね。

JVMのジェネリクスにおいての型パラメーターを保持しないのにはかなり嫌気が指していましたが、そのうちProject Valhallaで改善されそうですかね?

機能改善については楽しみですが、それまでにC#の沼で溺れ死ぬ未来が見えry

[Xamarin.Android] "zipalign.exe" はコード 1 を伴って終了しました。

Visual Studio 2017 Community(Windows)でXamarin.Androidプロジェクトを作成するときにでたエラーの対処法載せておきます。

Visual Studioのバージョンは15.6.7で、XamarinのバージョンはVisual Studio15.6.7でインストールできる最新版です。(具体的にはXamarin.Android SDK 8.2.0.16)

エラー内容ですがタイトルの通り、「"zipalign.exe" はコード 1 を伴って終了しました。」です。

内容が内容なので、プロジェクト設定かSDKのバグか、だいたいそのあたりかとは目星着きますが、Google大先生で調べてみたところデバッグ設定が原因のようでした。
Stack Overflow - “zipalign.exe” exited with code 1. (Xamarin.Android)C# Corner Forums - Deployment error with Xamarin android application でてきた検索結果です。
構成マネージャーから実行CPUをx86に固定してやるといいみたいです。(x86エミュレーターのため)

ん~~~なんでだろwよくわからないけど、とりあえずzipalign動いてくれればいいです。 (デバッグビルドの場合は関係ないですが)

引っ越ししました

報告が遅くなりましたが、引っ越ししました。

職場まで30分程度の場所なので、なかなかに朝が楽です。

そういうわけで新しい環境の紹介

Google Home + Google Home mini ヨドバシでGoogle Home miniが半額セールしてたのでセット買いしてしまいました。 リビングにGoogle Home、洗面所にGoogle Home miniといった感じに配置しています。
洗面所の隣が浴室なので、音楽を再生しながらお風呂に入れたりもします。
リビングにはGoogle Homeの他に、ChromecastとChromecast audioがあるので、そちらにキャストしたりもできます。Chromecast audioは特にキャストのグループ化ができるのでGoogle HomeとChromecast audioで同時に音楽をかけれたりします。
Nature Remo Google HomeやAmazon Alexaと組み合わせて赤外線リモコンを音声操作できるようにする奴です。 自宅では、赤外線リモコンはエアコンと照明ぐらいなので、その二つに対して音声操作しています。
音声操作のコマンドは通常では「ネイチャーリモを使って温度を上げて」のようなものになっていますが、Google Homeの設定に使うHomeアプリでショートカットを設定することによって「温度を上げて」のようなコマンドを作ることもできます。 また、自分はHomeアプリのショートカットで事足りましたが、エアコンが複数あるご家庭などではIFTTTというサービスを中継すれば、より細かいショートカット設定ができるようになります。
ルンバ 自分が購入したのはたしか890だったかと思います。 こちらもGoogle Homeと連携して音声操作ができますが、ルンバ自身の音で音声操作がかき消されるので、ルンバ終了時はスマホからテキストでGoogleアシスタントを呼び出しています。
さいごに めあたらしい装備は以上の通りですが、自分の環境上ケーブル類が多いのでそれの整理にとても便利だったものを紹介して終わりたいと思います。
DanYee マジックバンド 結束テープ 結束バンド 自由にカット ケーブル/コード等収納 オフィス用/お部屋用 全5色
ようは、切って調整するマジックテープです。これをぐるぐるに巻いたコードに…