“защищенные” методы в C#?

UsedRange прекрасно работает с ячейками «virgins», но если ваши ячейки заполнены в прошлом, то UsedRange доставит вам старое значение.

Например:

«Подумайте в листе Excel, в котором ячейки A1 - A5 заполнены текстом». В этом сценарии UsedRange должен быть реализован следующим образом:

Long SheetRows;
SheetRows = ActiveSheet.UsedRange.Rows.Count;

Переменная watch to SheetRows должна отображать значение 5 после выполнения этой пары строк.

Q1: Но что произойдет, если значение A5 будет удалено?

A1: Значение SheetRows будет равно 5

Q2: Почему это?

A2: поскольку MSDN определяет свойство UsedRange как:

Получает объект Microsoft.Office.Interop.Excel.Range, который представляет все ячейки, в которых содержится значение в любое время.


Итак, вопрос в том, существует ли какой-либо / какой-нибудь обходной путь для этого поведения?

Я думаю, что в 2 альтернативах:

  1. Избегайте удаления содержимого ячейка, предпочитая удаление всей строки (щелкните правой кнопкой мыши номер строки, затем «удалить строку».
  2. Используйте CurrentRegion вместо свойства UsedRange, как показано ниже:
Long SheetRows;
SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;

18
задан eRaisedToX 10 January 2019 в 18:37
поделиться

5 ответов

Защищенные методы можно вызывать из производных классов. Частные методы не могут.

Это единственное различие между частными и защищенными методами.

81
ответ дан 30 November 2019 в 05:38
поделиться

Некоторые аспекты .NET, такие как ASP.NET, создают подклассы вашего класса кода программной части во время выполнения. Так, например, класс страницы ASP.NET наследуется от своего класса программной части. Сделав метод защищенным, динамически генерируемый класс страницы может легко подключить событие нажатия кнопки к защищенному методу в базовом классе, который его обрабатывает.

2
ответ дан 30 November 2019 в 05:38
поделиться

Часто «защищенный» используется, когда вы хотите, чтобы дочерний класс переопределил в противном случае «частный» метод.

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"
7
ответ дан 30 November 2019 в 05:38
поделиться

Если у вас есть унаследованная форма (или любой класс, если на то пошло), вы можете вызывать эту функцию из подкласса.

1
ответ дан 30 November 2019 в 05:38
поделиться
  1. К защищенным методам можно получить доступ, наследовав классы, тогда как частные методы не могут.
  2. Помня, что файлы .aspx и .ascx наследуются от своего кода за классами (default.aspx.cs) , к защищенным методам можно получить доступ из .aspx / .ascx

Имейте это в виду: если у вас есть кнопка, и OnClick этой кнопки установлен на Button_Click

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

, то метод Button_Click должен иметь как минимум защищенный видимость, чтобы быть доступной по кнопке.

Вы можете обойти это, добавив к вашему методу Page_Load следующий:

btn.Click += new EventHandler(Button_Click);
4
ответ дан 30 November 2019 в 05:38
поделиться