2016/02/20 Hokuriku Comm CampのLTで発表した際のプレゼンテーションスライドです。
C#はラムダ記法で無名関数が書けますし、Javaも8からラムダ記法が可能になりました。 しかし無名関数では再帰関数が書けません。 さてどういうことか。 再帰関数の代表選手として階乗計算を例にとってみましょう。 まず、メソッドとして再帰的に書いてみます。 int Pow(int n) { return (n > 1) ? n * Pow(n - 1) : 1; } こうですね。では、これをラムダ記法で書こうとすると… Func<int, int> pow = n => (n > 1) ? n * 【ここに書くメソッド名がない!】(n - 1) : 1; そう、自分自身を呼ぼうにも自分自身は無名だから呼びようがないのです。困りました。 Javascriptを使う人は「arguments.calleeを使えばいい」と思うかもしれませんが、Javascriptだってもうarguments.call
Javaは決して悪い言語ではない。 C++からポインターの「*」やアロー演算子の「->」とかスコープ演算子の「::」とか気持ち悪いものを廃止・整理して、比較的読み易いシンタックスになったと思う。1995年当時から見れば、十分に出来の良い言語だったと思われる。 でも後発のC#でコーディングする機会が増えてきたら、如何にJavaが駄目(というか保守的な)言語かってのもまた同時に痛感してしまう。2005年リリースの2.0の時点で既にJavaをほぼ完全に上回っていると思うのに、その後ラムダ式・LINQ・拡張メソッドなど数多くの新機能が加わった現行C#とは最早比べるまでもないと思う。 以下は根拠。 ■注(2014年2月18日) このエントリーは殴り書きに等しい状態で放置してましたが、最近は思わぬところで読まれ始めたりしたので、ちょっと加筆修正しました。 ①そもそも純粋なオブジェクト指向言語ではない。
某勉強会で発表できなかったので、現状報告 & メモがてらに。 動機とか まぁ、一言でいうと「Spock」使いたい!!なんですが。 もっと言うと、「表現力の高いテストライブラリが使いたい」、になるんですが。 C#だとSpecFlowという手もあるし、個人的には嫌いではないんですが、いかんせん二種類のファイルを使わないといけない辛みとか、そこらへんでガンガン進めるまでには至ってないな~、と。 んで、ふとJVMの世界を見ると、やっぱSpockが魅力的に見えるんですよねー。 というわけで、大きな目的は、SpockでC#のテストを書くなんですが、そこはまぁ一旦おいておいて、それの大前提となる、Groovy上から.NETのライブラリを使う、というのに対してのアプローチをご紹介。します。 Groovy上で.NETのライブラリを使う JVMから.NETのライブラリを使えるようにする 結局JVM上で.NET
このエントリーは「C# Advent Calendar 2013」の17日目のエントリーです。 前日は id:ksasao さんの「GDI+ で描画&保存あれこれ - まちみのな@はてな」でした。 Java 8は2014年3月にリリースされる予定です。 どういう変更が含まれているのかは、Java 8のすべてにまとめられています。 また、きしださん(id:nowokay)のように、Java8に関する記事をたくさん書いている人もちらほらいます。 この記事では、InfoQの記事(および参照元の英語ブログ)を参考に、Java8の新機能をC#と比べてみたいと思います。 インターフェースの改善 インターフェースでstaticメソッドが定義できるようになった もともと、JavaのインターフェースはC#のインターフェースと違って、static finalなフィールドを持つことができました。 static
C# の本を読んでいたら、クラスのフィールドの初期化順序が Java と違っていてびっくりしました。 Java のフィールド初期化順序 Java でインスタンスを作成した場合、親クラスのフィールド初期化 → 親クラスのコンストラクタ実行 → 子クラスのフィールド初期化 → 子クラスのコンストラクタ実行 の順番で処理が行われます。 そのため、下記では Parent クラスのコンストラクタを呼び出した時点では Child クラスの c フィールドは初期化されていないため、System.out.println での出力が初期値である null になっています。 public class Program { public static void main(String[] args) { new Child(); } public static class Parent { // 順序① - 親ク
Java8 から追加されるインターフェイスの default 実装ですが、C# の拡張メソッドに似てますよね。 実際、このどちらも「シンインターフェイス」を定義するだけで「リッチインターフェイス」が手に入ります。 しかし、C# の拡張メソッドと Java のインターフェイスの default 実装には、それぞれの利点と欠点があります。 拡張メソッドの利点 拡張メソッドの利点は、インターフェイスの実装者だけでなく、 インターフェイスの使用者に対してもインターフェイスの拡張が開かれている点です。 既存の型ですら、後付けでメソッドを追加することができるということです。 using System; public static class StringExtension { // インターフェイスでなくても、どんな型に対しても拡張可能 public static int ToInt(this str
Java 8を関数型っぽく使うためのおまじない - きしだのはてな Java は大変ですね。 C# さんは、ラムダ式も Func 型(Java の Function 型に大体対応)も Visual Studio 2008 時代(5年前)から使えたので、似たようなことはすでにできます。 上記の記事のパクリなので、上記の記事をまずは読んでから読むことをおすすめします。 Func 型 C# では Func デリゲートというものがあります。名前空間名や型パラメータまで含めると、System.Func<TArg, TResult> です。 こんな感じで使います。 Func<string, string> enclose = s => "[" + s + "]"; これを呼び出そうとすると、こんな感じになります。 // Javaだとenclose.apply("foo")と、applyが必要 Syst
システム開発がますます複雑化していく中、エンジニアには、テクノロジを理解して、さまざまな場面に適した選択が求められます。本連載では、Javaと.NETの基本的な仕組みから最新の傾向や技術などについて、数回に分けて紹介します いまさら聞けない、Javaと.NETの違い 今日、アプリケーション開発・実行のプラットフォームは、大きく2つのテクノロジに収束しているといえるでしょう。 1つは、エンタープライズ・アプリケーション開発の定番ともいえる「Java」です。 実行環境、開発環境の無償提供、OSを自由に選べること、フレームワークや開発環境が充実していることが人気の理由です。大規模アプリケーションの採用実績も多く、ほかのプラットフォームをリードしてきました。 もう1つは、マイクロソフトが発表した「Microsoft.NET」構想に基づいた「.NET」です。 プラットフォームが主にWindowsに制
起きてから寝るまで、息を吸うのも、厠(かわや)での一連のアクションも.NET Frameworkで構築している私だが、実は少し前まで目を閉じるとまぶたの裏でJavaのマスコットである“Duke”がゴーゴー・ダンスを踊っちゃうくらいにJavaな日々を送っていた。そんな私が過去の資産を捨てて.NET Frameworkに転んだ理由は簡単。.NET Framework、特にC#の設計思想が私のし好に合っていると感じたためだ。 本稿では、私がJavaからC#に乗り換えた理由を示し、それを基にC#の“正しい”使い方について考察する。C#に興味のあるJavaプログラマや、どう使えばよいのか悩んでいるC#プログラマに読んでいただきたい。そうそう、アーキテクトにも。プログラミングできないアーキテクトなどあり得ないのだから。 C#とJavaは似ていない。確かに表面上は似ているが、C#にはJavaにはない文法
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く