C# 中有没有方法来检查字符串是否是有效标识符
在 Java 中,Character 类上有名为 isJavaIdentifierStart
和 isJavaIdentifierPart
的方法,可用于判断字符串是否为有效的 Java 标识符,如下所示
public boolean isJavaIdentifier(String s) {
int n = s.length();
if (n==0) return false;
if (!Character.isJavaIdentifierStart(s.charAt(0)))
return false;
for (int i = 1; i < n; i++)
if (!Character.isJavaIdentifierPart(s.charAt(i)))
return false;
return true;
}
:这是 C# 的吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
是:
从这里:如何确定是否string 是有效的变量名吗?
Yes:
From here: How to determine if a string is a valid variable name?
我会对这里提供的其他解决方案保持警惕。调用 CodeDomProvider.CreateProvider 需要查找并解析 Machine.Config 文件以及您的 app.config 文件。这可能比您自己检查字符串所需的时间慢几倍。
相反,我建议您进行以下更改之一:
将提供程序缓存在静态变量中。
这将导致您只需要创建一次,但会减慢类型加载速度。
通过创建您自己的 Microsoft.CSharp.CSharpCodeProvider 实例来直接创建提供程序
这将跳过所有配置文件解析。
编写代码来实现您的自我检查。
如果您这样做,您就可以最大程度地控制其实施方式,这可以帮助您在需要时优化性能。请参阅 C# 语言规范,用于 C# 标识符的完整词法语法。
I would be wary of the other solutions offered here. Calling CodeDomProvider.CreateProvider requires finding and parsing the Machine.Config file, as well as your app.config file. That's likely to be several times slower than the time required to just check the string your self.
Instead I would advocate you make one of the following changes:
Cache the provider in a static variable.
This will cause you to take the hit of creating it only once, but it will slow down type loading.
Create the provider directly, by creating a Microsoft.CSharp.CSharpCodeProvider instance your self
This will skip the config file parsing all together.
Write the code to implement the check your self.
If you do this, you get the greatest control over how it's implemented, which can help you optimize performance if you need to. See section 2.2.4 of the C# language spec for the complete lexical grammar for C# identifiers.
由于 Roslyn 是开源的,代码分析工具触手可及,而且它们是为性能而编写的。 (目前它们处于预发布状态)。
但是,我无法谈论加载程序集的性能成本。
使用 nuget 安装工具:
提出您的问题:
With Roslyn being open source, code analysis tools are right at your fingertips, and they're written for performance. (Right now they're in pre-release).
However, I can't speak to the performance cost of loading the assembly.
Install the tools using nuget:
Ask your question:
基本上是这样的:
Basically something like:
这里有亡灵术。
在 .NET Core/DNX 中,您可以使用 Roslyn-SyntaxFacts 来完成此操作
或者在 Codedom 的旧版本中 - 查看单声道源代码后:
CodeDomProvider.cs
然后 CSharpCodeProvider.cs
然后 CSharpCodeGenerator.cs
您将得到以下代码:
Necromancing here.
In .NET Core/DNX, you can do it with Roslyn-SyntaxFacts
Or in the old variant with Codedom - After a look in the mono sourcecode:
CodeDomProvider.cs
Then CSharpCodeProvider.cs
Then CSharpCodeGenerator.cs
You get this code:
最近,我编写了一个扩展方法,用于验证字符串是否为有效的 C# 标识符。
您可以在此处找到实施要点:https://gist.github.com/FabienDehopre/5245476
它基于 Identifier 的 MSDN 文档 (http ://msdn.microsoft.com/en-us/library/aa664670(v=vs.71).aspx)
Recently, I wrote an extension method that validates a string as a valid C# identifier.
You can find a gist with the implementation here: https://gist.github.com/FabienDehopre/5245476
It's based on the MSDN documentation of Identifier (http://msdn.microsoft.com/en-us/library/aa664670(v=vs.71).aspx)
现在发布的 Roslyn 项目提供了
Microsoft.CodeAnalysis.CSharp.SyntaxFacts
,SyntaxFacts.IsIdentifierStartCharacter(char)
和SyntaxFacts.IsIdentifierPartCharacter(char)
方法就像 Java 一样。这里正在使用它,在一个简单的函数中,我使用它来将名词短语(例如“Start Date”)转换为 C# 标识符(例如“StartDate”)。注意我正在使用 Humanizer 进行驼峰式大小写转换,并使用 Roslyn 检查字符是否有效。
测试;
The now-released Roslyn project provides
Microsoft.CodeAnalysis.CSharp.SyntaxFacts
, withSyntaxFacts.IsIdentifierStartCharacter(char)
andSyntaxFacts.IsIdentifierPartCharacter(char)
methods just like Java.Here it is in use, in a simple function I use to turn noun phrases (eg "Start Date") into C# identifiers (eg "StartDate"). N.B I'm using Humanizer to do the camel-case conversion, and Roslyn to check whether a character is valid.
Tests;
这可以使用反射来完成 - 请参阅如何判断一个字符串是否是一个有效的变量名?
This can be done using reflection - see How to determine if a string is a valid variable name?