2013-05-19 3 views
2

Мне сложно вызвать функцию из класса C# аналогично тому, как я вызываю функцию из модуля VB.NET.C# Static Class vs VB.NET Использование модуля

У меня есть C# класс General.cs

using System; 

    namespace XYZ.Classes 
    { 
    public static class General 
    { 
     //Object Null to Empty Function 
     public static string NullToEmpty(object obj) 
     { 
      var returnString = ""; 
      if (obj != null) 
      { 
       returnString = obj.ToString(); 
      } 
      return returnString; 
     } 

    } 
    } 

Этот тип функции может быть вызван в VB.NET из любого места в проекте без объявления модуля или предваряя вызов - только с помощью

dim x as String = NullToEmpty(obj) - VB.NET 

    var x = NullToEmpty(obj) - C# 

Из моего googling, кажется, что открытый статический класс с общедоступными статическими методами может выполнить это в C#.

C# Пример:

класса foo.cs

namespace XYZ.Classes 
    { 
     public class Foo 
     { 

      public string doFoo() 
      { 
       var obj = null; 
       var foolish = NullToEmpty(obj); 
       return foolish; 
      } 
     } 
    } 

Функция показывает в IntelliSense (с помощью ReSharper) - но это не действует (красный), так что-то правильно не ссылаться - я m just guessing ...

Точка в состоянии просто использовать общие функции «User Defined» для нулевого захвата, форматирования и т. д. - чтобы не обертывать все виды вещей в уродливые C# код:

obj.FooField = dr["Foo"] == null ? "" : dr["Foo"]; 

бы предпочли:

obj.FooField = NullToEmpty(dr["Foo"]); 

Это становится еще более полезным для DateTime приложений:

obj.ActivityStartDate = dr["ActivityStartDate"] == null ? "" : Convert.ToDateTime(dr["ActivityStartDate"]).ToString("yyyy-MM-dd HH:mm:ss"); 

против:

obj.ActivityStartDate = GetDate(dr["ActivityStartDate"]); 

Или целочисленного преобразования:

cmd.Parameters["@BirthdayDay"].Value = String.IsNullOrEmpty(obj.BirthdayDay) ? 01 : Convert.ToInt32(obj.BirthdayDay); 

против:

cmd.Parameters["@BirthdayDay"].Value = NullToZero(dr["obj.BirthdayDay"]); 

Некоторые C# гуру должен знать это :-)

Благодаря

+1

Вы попробовали 'General.NullToEmpty'? В C# вам нужно включить имя класса при вызове статического метода извне класса (если не метод расширения). – Oded

ответ

1

Мой опыт был в том, что лет У вас есть несколько вариантов:

1) Вставьте функцию утилиты в базовый класс, наследуемый всеми вашими другими классами. Это не очень практичное решение, потому что у вас, вероятно, будут классы, которые наследуют от сторонних или .NET-классов, которые очень сложно изменить.

2) Используйте Extension methods, чтобы расширить функциональность до существующих базовых классов. Я думаю, что в итоге это будет больше работы, чем того стоит.

3) Создайте класс подстановочного класса с простыми именами (т. Е. Util) и просто префикс своих методов с этим именем.

Мы использовали вариант 3, чтобы преобразовать большое приложение VB в C#, и он работал достаточно хорошо. Хотя это не совсем удобно, как синтаксис VB, как только вы привыкнете к нему, с ним будет очень легко работать.

+0

Вариант 3 работает, но разочаровывает :-(Так же, как до того, как C# 4.0 включил необязательные параметры для функций. Почему мы должны префикс всех этих простых UDF? Или еще лучше - почему C# не имеет простого значения null конверсии встроены? Просто заставляя разработчиков писать тонны кода шаблона для захвата ошибок идиота? Извините, я не хочу быть грубым :-) Спасибо за подсказку. – Charlez

+0

Кажется, использует Util. опция префикса - это наименьшее из пороков в этом сценарии. Методы расширения - это типичное M $ overcomplication - возможно, в ближайшие 10 лет какой-то поставщик будет определять, как автоматически запускать ловушку с помощью нескольких эвристик и базового здравого смысла - это то же самое кодирование снова и снова - на всех видах языков хммммм ... может быть, это будет моя докторская диссертация? – Charlez

2

Доступ статический метод в классе требует, чтобы включить ВЛАДЕЛЕЦ класс

obj.FooField = General.NullToEmpty(dr["Foo"])

1

VB.NET добавляет методы в модуль в глобальное (неназванное) пространство имен. Это, в основном, функция back-compat, если бы команда смогла удалить поддержку модуля, то они, вероятно, сделали бы это. Но они не могли, было бы слишком сложно переносить код VB6 на VB.NET. Практика имеет смысл и не масштабируется вообще, вы, как правило, сталкиваетесь с проблемами, когда проект становится большим. Проблема известна как «глобальное загрязнение пространства имен».

Программисты, как правило, работают вокруг него, указав имена методов в качестве префикса. Что работает, но довольно неудобно, так как вы должны кашлять этот префикс каждый раз, когда хотите вызвать метод, для этого нет аналога директивы Imports. IntelliSense сильно страдает.

C# просто не разрешает делать это вообще. Ближе всего вы можете использовать методы расширения. Но не надо, привыкнуть к C# Way.

+0

Спасибо за урок истории :-) - что вы 'C# путь' вы рекомендуете? Метод Util expert_tech рекомендует «выполнять задание» и уменьшает шаблонный код. Остается вопрос о том, как это сделать без повторяющегося кода шаблона или префиксации, чтобы выполнить базовое нулевое захват. Большое спасибо, помощник :-) – Charlez

+0

Что вы называете «уродливым», программисты на C# называют «нормальным». Путь C# - не думать, что это уродливо. Проходит некоторое время. –

+0

Welp, я думаю, тайна, почему стартапы не используют C#, была решена. Они обречены на то, чтобы нанять разработчиков, которые думают, что это хорошая идея - я знаю, - давайте раздуем наш CRUD-код на 30% - нам платит персонаж? Прошу прощения, прошу прощения, что у меня есть скука ... – Charlez