Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Visual Studio_Oop_Access Modifiers - Fatal编程技术网

&引用;“受保护”;C#中的方法?

&引用;“受保护”;C#中的方法?,c#,.net,visual-studio,oop,access-modifiers,C#,.net,Visual Studio,Oop,Access Modifiers,在C#中定义方法为受保护的,有什么好处 比如: protected void KeyDemo_KeyPress( object sender, KeyPressEventArgs e ) { // some code } 与此相比, private void FormName_Click( object sender, EventArgs e ) { //some code } 我在很多书中都看到过这样的例子,我不明白他们为什么和什么时候使用privatevsprotect

在C#中定义方法为
受保护的
,有什么好处

比如:

protected void KeyDemo_KeyPress( object sender, KeyPressEventArgs e ) 
{
    // some code
}
与此相比,

private void FormName_Click( object sender, EventArgs e )
{
    //some code
}

我在很多书中都看到过这样的例子,我不明白他们为什么和什么时候使用
private
vs
protected

受保护的方法可以从派生类调用。私有方法无法执行。


这是私有方法和受保护方法之间唯一的区别。

ASP.NET等.NET的某些方面在运行时创建代码隐藏类的子类。例如,ASP.NET页面类继承自其codebehind类。通过保护该方法,动态生成的page类可以轻松地将按钮单击事件连接到处理该事件的基类中受保护的方法。

如果您有继承的表单(或任何此类),则可以从子类中调用该函数

当您希望子类重写其他“私有”方法时,通常使用“protected”

public class Base {
    public void Api() {
       InternalUtilityMethod();
    }
    protected virtual void InternalUtilityMethod() {
       Console.WriteLine("do Base work");
    }
}

public class Derived : Base {
    protected override void InternalUtilityMethod() {
       Console.WriteLine("do Derived work");
    } 
}
因此,我们拥有我们从继承中了解和喜爱的重写行为,而不会不必要地将InternalUtilityMethod暴露给我们类之外的任何人

var b = new Base();
b.Api();  // returns "do Base work"
var d = new Derived();
d.Api(); // returns "do Derived work"
  • 受保护的方法可以通过继承作为私有方法无法访问的类来访问
  • 请记住,.aspx和.ascx文件继承自它们的代码隐藏类(default.aspx.cs),可以从.aspx/.ascx中访问受保护的方法
  • 记住这一点:如果您有一个按钮,并且该按钮的OnClick设置为button\u Click

    <asp:Button id="btn" runat="server" OnClick="Button_Click" />
    

    受保护的方法与私有方法一样。它们只能由类的成员访问。唯一不同的是,与私有成员不同,受保护的成员也可以由派生类访问

    但是在这本书的这些例子中没有继承。plz我不明白我们是这样做的……你能从这个类派生一个表单吗?然后您可能希望能够从该类调用KeyDemo_KeyPress,如果它是私有的,这是不可能的。但是,由于您可能不希望其他类能够访问该函数,因此它不能是公共的。因此,它受到保护。这是不正确的。受保护!=事实上的方法必须是虚拟的,才能在派生类中重写它们。虚拟方法可以受到保护,但也可以是公共的或内部的。受保护的方法不能被重写,除非它是虚拟的。你说得对,我也应该将它们标记为虚拟的。有了这个拼写错误,我仍然相信这是“受保护”的一个常见用例。我将编辑上面的代码…不,这是“虚拟”的常见用例。问题是关于“受保护的”,而不是“虚拟的”。这是一个使用“受保护的”的特定情况的合理示例,但没有解决这样一个事实,即该示例也是受保护内容的一个非常狭窄的范围。这应该被标记为可接受的答案!;)重要的是要认识到“受保护”是一个访问修饰符。下面是它们的比较:对于所有修饰符:
    btn.Click += new EventHandler(Button_Click);