Я столкнулся с этим унаследованным кодом, который имеет статический класс, содержащий перечисление и метод расширения с собственным пространством имен. Я упростил это ниже:
namespace AuxValidator
{
public static class AuxValidator
{
public enum BadDataSentinal { UPPER = 0, LOWER = 1, WHATEVER = 2 }
public static string Upper(this string field, BadDataSentinal badData, List<string> NewDataWatchlist = null)
{
if (badData == BadDataSentinal.UPPER)
return field.Upper();
return field
}
}
}
Этот вышеприведенный класс находится внутри App_Code.
Он используется в одном из моих файлов aspx.cs,
using AuxValidator;
public partial class SimplePage : RootPage
{
private void updateBoxes(object source, ServerValidateEventArgs args, string controlName, ValidationFunction f)
{
CustomValidator cv = (CustomValidator)source;
TextBox src = ((TextBox)cv.FindControl(controlName));
src.Text = args.Value.Upper(AuxValidator.AuxValidator.BadDataSentinal.UPPER);
}
}
Это работает. Однако обратите внимание, что для доступа к Enum необходимо сначала объявить пространство имен AuxValidator, а затем класс AuxValidator только для использования перечисления. Если я возьму пространство имен и попытаюсь использовать его как AuxValidator.BadDataSentinal.UPPER, я получу:
Имя типа или пространства имен «BadDataSentinal» не существует в пространство имен «AuxValidator»
Это немного неудобно, поэтому интуитивно я выношу BadDataSentinal из класса AuxValidator, чтобы я мог получить к нему доступ просто с помощью BadDataSentinal.UPPER.
Или я могу избавиться от пространства имен внутри моего класса AuxValidator, чтобы я мог получить доступ как AuxValidator.BadDataSentinal.UPPER.
Мой вопрос:
1: Почему общедоступное перечисление внутри статического класса должно объявлять пространство имен, в котором оно используется, несмотря на то, что оно уже импортировано с помощью «использования»
2: Есть ли причина для публичного перечисления в статическом классе?
1-Когда мы определяем класс в пространстве имен в C#, вам нужно указать полное имя класса, чтобы использовать его, даже если вы импортировали пространство имен с помощью директивы using. Это связано с тем, что C# требует полных имен, чтобы избежать конфликтов имен между разными пространствами имен. В вашем случае перечисление BadDataSentinal определено в классе AuxValidator, поэтому для доступа к нему необходимо использовать полное имя AuxValidator.AuxValidator.BadDataSentinal. 2. Может быть причина для определения общедоступного перечисления в статическом классе, если перечисление тесно связано с функциональностью, предоставляемой классом.
learn.microsoft.com/en-us/archive/blogs/ericlippert/…
Есть другое решение. Измените using на using static AuxValidator.AuxValidator. Тогда вы сможете использовать перечисление просто как BadDataSentinal.UPPER.





1: Почему публичное перечисление внутри статического класса должно объявлять пространство имен, в котором оно используется, несмотря на то, что оно уже импортировано с помощью «using»
Это связано с тем, что пространство имен и класс имеют одно и то же имя AuxValidator, поэтому компилятор будет интерпретировать AuxValidator как пространство имен. Если у них другое имя, вам не нужно указывать пространство имен дважды.
2: Есть ли причина для публичного перечисления в статическом классе?
Не совсем.
Все, что у вас есть, доступно для широкого толкования. Но если вы применяете определенные правила, вы можете стандартизировать свой код.
«Почему публичное перечисление внутри статического класса должно объявлять пространство имен, в котором оно используется, несмотря на то, что оно уже импортировано с помощью« использования »» - хорошие стандарты кодирования сделали бы незаконным наличие пространства имен и класса с одинаковым именем. И вот вам отличный пример, почему это нужно делать - чтобы не использовать полное имя и для ясности кода.
«Есть ли причина для публичного перечисления в статическом классе?» - по хорошим стандартам публичные перечисления могут быть объявлены в статических или экземплярных классах, когда такие перечисления используются только этими классами и больше нигде.
«Или я могу избавиться от пространства имен» - вы должны переименовать пространство имен во что-то отличное от вашего класса. Кроме того, классы и пространства имен должны иметь разные стили именования. Если ваш класс назван в правильном стиле - AuxValidator, пространство имен должно быть примерно таким SomeValidation. Поскольку это находится в APP_Code, у вас не должно возникнуть проблем с его переименованием, потому что это не что-то вроде библиотеки перераспределения, где вы не хотите расстраивать клиентов критическими изменениями.
это, вероятно, необходимо для устранения неоднозначности между типом и пространством имен.