ame*_*vin 5 c# asp.net exception
星期五,当我收到堆栈溢出错误时,我正在处理应用程序的公共注释部分,这让我很困惑,所以我想我会请求帮助.使用"堆栈溢出"这个表达式搜索网页有点弄巧成拙!
我想在发送要添加到数据库的类的实例之前,在类的字段的set语句中执行HtmlEncode:
public class Feedback
{
    public Feedback() { }
    public string FeedbackComment
    {
        get { return FeedbackComment; }
        set {System.Web.HttpUtility.HtmlEncode(value); }
    }
    // other fields 
    // methods
}
这导致了StackOverflow错误,我通过将代码更改为如下所示来修复错误:
public class Feedback
{
    public Feedback() { }
    private string feedbackComment;
    public string FeedbackComment
    {
        get { return feedbackComment; }
        set { feedbackComment = System.Web.HttpUtility.HtmlEncode(value); }
    }
    // other fields 
    // methods
} 
但我只想解释为什么第一个get/set语句是如此递归以至于它们导致堆栈溢出但是当将代码恢复为更像c#2.0时?这可以通过更短的语法来实现,如果是这样的话怎么样?
这是我的第一个问题 - 请尽量保持温和!
And*_*are 21
第一个示例的getter返回属性本身,而不是返回支持字段.
// The property name is "FeedbackComment"
public string FeedbackComment
{
    // And here you are returning "FeedbackComment" which is
    // creating the stack overflow
    get { return FeedbackComment; }
}
不幸的是,没有办法缩短你拥有的东西,自动实现的属性(即public String FeedbackComment { get; set; })必须有空的getter和setter块才能在语法上正确.你的第二个例子没有任何问题 - 是的,它有点冗长,但它清晰,简洁,并完成工作.
getter引用自身(正如Andrew指出的那样)但是setter也是错误的.
这段代码:
set { System.Web.HttpUtility.HtmlEncode(value); }
......实际上没有设置任何东西.该HtmlEncode方法返回编码值,实际上并没有改变value.
你应该记住的另一件事是,如果你正在HtmlEncode进入,你需要HtmlDecode在出路,否则你最终可能会有多种编码(这不是幂等的).如果您正在尝试"自动化"编码过程,那么该类通常看起来像这样:
public class Foo
{
    private string bar;
    public string Bar
    {
        get { return HttpUtility.HtmlDecode(bar); }
        set { bar = HttpUtility.HtmlEncode(value); }
    }
    public string SafeBar
    {
        get { return bar; }
    }
}
或者您可以反转安全/不安全逻辑,例如:
public string Bar
{
    get { return bar; }
    set { bar = HttpUtility.HtmlEncode(value); }
}
public string UnsafeBar
{
    get { return HttpUtility.HtmlDecode(value); }
}
无论哪种方式,你的类应该明确表示它正在进行某种编码,否则如果你编写这样的代码:
Foo foo1 = new Foo();
foo1.Bar = "<test>";
Foo foo2 = new Foo();
foo2.Bar = foo1.Bar;
...然后你会开始在输出中看到一堆丑陋的转义字符foo2.Bar.让你的类的合同中予以明确,它应该要么执行两种编码和解码或做没有一个.