6

In C#, if you want a String to be taken literally, i.e. ignore escape characters, you can use:

string myString = @"sadasd/asdaljsdl";

However there is no equivalent in Java. Is there any reason Java has not included something similar?

Edit:

After reviewing some answers and thinking about it, what I'm really asking is:
Is there any compelling argument against adding this syntax to Java? Some negative to it, that I'm just not seeing?

4

8 に答える 8

5

Java は常に最小限の言語として私を驚かせてきました。逐語的な文字列は (たとえばプロパティのように) 必須ではないため、含まれていなかったと思います。

たとえば、C# では、プロパティのようなことを行う簡単な方法がたくさんあります。

public int Foo { get; set; }

および逐語的な文字列:

String bar = @"some
string";

Java は、できるだけ多くの構文糖を避ける傾向があります。フィールドのゲッターとセッターが必要な場合は、次のようにする必要があります。

private int foo;

public int getFoo() { return this.foo; }
public int setFoo(int foo) { this.foo = foo; }

文字列はエスケープする必要があります。

String bar = "some\nstring";

それは、多くの点で C# と Java の設計目標が異なるためだと思います。C# は急速に開発され、多くの機能が常に追加されていますが、そのほとんどは構文糖衣である傾向があります。一方、Java はシンプルさと理解しやすさを重視しています。そもそも Java が作成された理由の多くは、C++ の複雑な構文に対する反応でした。

于 2009-03-08T16:45:22.813 に答える
2

言ったように、ほとんどの場合、文字をエスケープしたいのは正規表現用です。その場合は次を使用します: Pattern.quote()

于 2009-03-08T17:24:13.690 に答える
2

「なぜ」という質問は面白いと思います。C# は新しい言語であり、Java などの他の言語で欠点と見なされているものを改善しようとしています。「なぜ」という質問の単純な理由は、Java 標準が C# のような @ 演算子を定義していないことです。

于 2009-03-08T16:46:47.930 に答える
1

Javaには(残念ながら)このようなものはありませんが、Groovyにはあります:

assert '''hello,
world''' == 'hello,\nworld'
//triple-quotes for multi-line strings, adds '\n' regardless of host system
assert 'hello, \
world' == 'hello, world' //backslash joins lines within string

.NETの作業を行ったとき、C#のこの機能が本当に気に入りました。これは、SQLクエリを切り取って貼り付ける場合に特に役立ちました。

于 2009-03-09T17:23:06.443 に答える
1

その理由の 1 つは、正規表現 (これらの種類の文字列リテラルの主な理由) が Java 1.4 まで Java プラットフォームの一部ではなかったからだと思います (私の記憶が正しければ)。言語が定義されたとき、これはそれほど必要ではありませんでした。

于 2009-03-08T16:48:13.977 に答える
0

この質問は、「なぜ Java は Python のようにインデントに依存しないのですか?」のようなものだと思います。言及された構文は砂糖ですが、冗長です(余分です)。

于 2009-03-08T16:47:55.197 に答える
0

理由はわかりませんが、エスケープ文字をエスケープすることで実行できます。すべてのエスケープ文字の前にバックスラッシュがあるため、二重のバックスラッシュを挿入すると、エスケープ文字を効果的にキャンセルできます。たとえば、"\now" は改行を生成し、文字 "ow" を生成しますが、"\now" は "\now" を生成します

于 2009-03-08T16:49:38.233 に答える
0

IDE が問題を処理してくれるはずです。文字列の途中で生のテキストをコピーして貼り付けると、テキストがエスケープされます。

PERL には文字列リテラルを設定するさまざまな方法があり、Java にもこれらをサポートしてほしいと思うことがあります。;)

于 2009-03-08T17:21:03.523 に答える