Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#方法内容验证_C#_Validation - Fatal编程技术网

C#方法内容验证

C#方法内容验证,c#,validation,C#,Validation,我需要验证C#方法的内容 我不关心不会影响方法作用域的语法错误 我确实关心那些会使其余代码的解析无效的字符。例如: method() { /* valid comment */ /* <-- bad for (i..) { } for (i..) { <-- bad } method() { /*有效意见*/ /*正则表达式肯定不是这个问题的答案。正则表达式对于某些类型的数据验证是有用的工具。但一旦你进入更复杂的数据业务,如匹配大括号或注

我需要验证C#方法的内容

我不关心不会影响方法作用域的语法错误

我确实关心那些会使其余代码的解析无效的字符。例如:

method()
{
  /* valid comment */
  /*           <-- bad
  for (i..) {
  } 
  for (i..) {  <-- bad
}
method()
{
/*有效意见*/

/*正则表达式肯定不是这个问题的答案。正则表达式对于某些类型的数据验证是有用的工具。但一旦你进入更复杂的数据业务,如匹配大括号或注释块,正则表达式就不再能完成这项工作

下面是一篇关于使用正则表达式验证输入时遇到的限制的博客文章

为了做到这一点,您必须编写一个进行验证的解析器。

如果您试图“验证”定义方法的字符串的内容,那么您最好只是尝试使用CodeDom类并将该方法动态编译到内存程序集中


编写自己的全功能解析器来进行验证将非常非常困难,特别是如果您想支持C#3或更高版本。Lambda表达式和其他类似的构造将非常难以干净地“验证”。

您在“将使解析其余代码无效的字符”之间画了一个错误的二分法和“语法错误”。缺少右大括号(您提到的问题之一)是一个语法错误。看起来您的意思是,您正在寻找可能会打破范围边界的语法错误?不幸的是,除了使用完整的解析器之外,没有可靠的方法可以做到这一点

例如:

method()
{ <-- is missing closing brace
  /* valid comment */
  /*           <-- bad
  for (i..) {
  } 
  for (i..) {  
} <-- will be interpreted as the closing brace for the for loop
method()

{对于这样的任务来说,正则表达式不是一件非常方便的事情。这通常是使用具有如下算法的堆栈来实现的:

  • 创建一个空堆栈S
  • While(还有字符){
  • 读一个字符ch
  • 如果是开口部分(任何类型),将其推到S上
  • 否则
  • 如果ch是一个结束语,请看S的顶部
  • 如果此时S为空,则报告失败
  • 如果S的顶部是与c相对应的开口部分, 然后弹出S并继续到1,该参数匹配OK
  • 否则报告失败
  • 如果在输入结束时堆栈S不是空的,则返回failure。 否则,你就会成功

  • 有关更多信息,请检查和

    您需要更仔细地审视您的问题,以便得到合理的答案

    例如,您将如何处理包含预处理器指令的方法

    void M()
    {
    
    #if FOO
        for(foo;bar;blah) {
    #else
        while(abc) {
    #endif
            Blah();
        }
    }
    
    这是愚蠢的但合法的,所以你必须处理它。你是否要将其视为不匹配的括号


    你能提供一个详细的规格说明吗?正如我们在这个网站上多次看到的那样,没有规格说明,人们无法成功地建立一个将两个数字分开的例程。你所说的分析远比将两个数字分开要复杂得多;代码实现了你想要的功能实际编译器中的描述有数万行之长。

    方法的大括号不是我要验证的部分。只有我需要验证的字符串中的内容我以前考虑过这个特定问题,没有理由不使用缩进来确定最后一个大括号是用于方法的d、 @user258651抱歉-那么,我一定误解了您的代码示例。您所说的“@Simon您可能是对的,因为目标似乎是一个信息丰富的工具,而不是一个需要严格正确性的工具,而且现在大多数代码都很好地缩进了”是什么意思{步骤#4不正确,因为您必须考虑注释。以下代码将注册为有效代码,但实际上无效:foo(//)regex有助于忽略注释或字符串中的内容,但是-您可以一次性匹配整个内容,不需要解析器状态。@JaredPar:行注释只是一个“/”开头,与“\n”匹配关闭。阻止注释或字符串也没什么不同。@Simon提到的算法没有试图忽略注释,因此它们的实现是不正确的。@jaredpar你完全正确。我确实认为它包含了我留下的一般想法,作为读者的练习添加在边缘案例中…;)我不需要绝对的解决方案。我是什么试图提供一个简单的指标,表明代码中可能存在错误。1.如果代码包含预处理语句,请不要执行任何操作。这对于我的用户来说是一个棘手的问题,更难解决一个数量级。2.如果代码包含不匹配的{或/*,突出显示它,虽然不太详细,但它确切地说明了我需要什么。@user258651:好的,字符串呢?假设您的代码有一个不匹配的大括号,但包含Console.WriteLine(“}”);--这些是否算作大括号结尾?@user258651:如果注释包含大括号怎么办?是否算作大括号结尾?@user258651:另外,我注意到“如果代码包含预处理指令,则什么也不做”逻辑上要求您必须为预处理器指令编写检测器,否则您不知道是否什么都不做。从各方面来说,您是对的。这是我必须投入大量研究时间的事情。我所寻找的简单解决方案根本不存在。