Работа с "Свой код C#"

  • Автор темы Автор темы shade
  • Дата начала Дата начала

shade

Client
Регистрация
19.11.2010
Сообщения
580
Реакции
346
Баллы
63
Доброго времени суток!

Мне и не только мне часто приходится отвечать на вопросы касающиеся "Своего кода C#" и снипетов.
Поэтому я хочу собрать основные вопросы и ответы на них в одной теме. И так:

Вопрос №1: Когда действие "Свой код C#" выходит по плохому выходу и как его можно генерировать?

Плохой выход в коде возникает в случаи exception (то есть в результате ошибки во время выполнения кода). К примеру:
JavaScript:
Развернуть Свернуть Копировать
// объявим объект
Random rnd = null;

// попробуем вызвать методы 
int a = rnd.Next(100);
// и получим NullReferenceException т.е. Ссылка на объект не указывает на экземпляр объекта.

Средства .Net позволяют генерировать исключения через следующий код:
JavaScript:
Развернуть Свернуть Копировать
throw new System.Exception("Плохой выход");
где "Плохой выход" - текст указанный пользователем. Так же есть и специализированные исключения, к примеру:
JavaScript:
Развернуть Свернуть Копировать
throw new System.NullReferenceException("Объект не создан");
Подробности на http://msdn.microsoft.com/ (http://msdn.microsoft.com/ru-ru/library/System.Exception.aspx)

Вопрос №2: Почему присвоение значения переменной проекта вызывает ошибку?

Переменные проекты такие как {-Variable.var-} в коде доступны в следующем виде и имеет строковое (текстовое) значения:
JavaScript:
Развернуть Свернуть Копировать
string str = project.Variables["var"].Value;

C# - язык строго типизированный поэтому нужно приводить типы. Для этого в .Net есть специальный класс Convert(http://msdn.microsoft.com/ru-ru/library/system.convert.aspx),
который может привести любой простой тип (такие как int, double, float, string, ...) в любой другой простой тип. К примеру есть {-Variable.var-} = "3" то:
JavaScript:
Развернуть Свернуть Копировать
int a = Convert.ToInt32(project.Variables["var"].Value);
обратный перевод:
JavaScript:
Развернуть Свернуть Копировать
int a = 3;
// так
project.Variables["var"].Value = Convert.ToString(a);
// или так
project.Variables["var"].Value = a.ToString();

Любой объект (объект класса или переменная) содержит метод ToString() который работает так же как Convert.ToString(Type).
Однако этот перевод возможен только с простыми типами.

При использовании return преобразование в строковое значение не обязательно.

Вопрос №3: Возможно ли создание переменой, списка или таблиц в проекте из кода?

Нет.

Вопрос №4: Я скопировал код из интернета, а он не работает. Почему?

Не любой код на C# будет работать в "Свой код C#". Общей методики перевода нет. Но можно кое что посоветовать:

1) Код C# файла работать не будет. К примеру:
JavaScript:
Развернуть Свернуть Копировать
using System;

public class Person
{
   private string _name;

public string Name 
   {
      get { return _name; } 
      set { _name = value; }
   }

public override int GetHashCode()
   {
      return this.Name.GetHashCode();  
   }  

public override bool Equals(object obj)
   {
       // This implementation handles a null obj argument.
       Person p = obj as Person; 
       if (p == null) 
          return false;
       else
          return this.Name.Equals(p.Name);
   }
}

public class Example
{
   public static void Method()
   {
      Person p1 = new Person();
      p1.Name = "John";
      Person p2 = null; 

Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));   
   }
}

Однако вот такой будет:
JavaScript:
Развернуть Свернуть Копировать
ulong[] numbers = { UInt64.MinValue, 6121, 403890774, UInt64.MaxValue };
bool result;

var list = new List<string>();

foreach (ulong number in numbers)
{
   result = Convert.ToBoolean(number);   
   list.Add(String.Format("{0,-26:N0}  -->  {1}", number, result));                              
}

То есть "C# код" выполняет только тело метода.

2) Если требуется передать какие то параметры в свой код или же получить из кода, то можно использовать переменные проекта и получать через project.Variables (так же вернуть значение можно через return).

3) Если вы скопировали кусок кода которые должен работать, но во время компиляции ошибка что то вроде "Не удалось найти что то. Возможно отсутствует ссылка на сборку":

Первое проверьте пространства имен. К примеру код:
JavaScript:
Развернуть Свернуть Копировать
var stream = new StreamReader(path);
должен быть таким
JavaScript:
Развернуть Свернуть Копировать
var stream = new System.IO.StreamReader(path);

Второе подключите все необходимые сборки через блок "Ссылки из GAC".

Если не знаете пространство имен класса или сборку (и если класс из стандартных средств .Net), то можно поступить следующим образом:
В поиске google (или любой другой поисковик) указать название класса и в ссылке на msdn перейти на страницу, а в описании класса указана вся информация.
К нашему примеру:

Пространство имен: System.IO
Сборка: mscorlib (в mscorlib.dll)
 
Интересная статья))
А как быть если мне нужно увеличить значение проектной переменной на 1?
Вот проектная переменная:
project.Variables["var"].Value;

Как мне в C# коде увеличить её на единицу? :-)
 
project.Variables["var"].Value = Convert.ToString(Convert.ToInt32(project.Variables["var"].Value)+1);
 
  • Спасибо
Реакции: KitKat21 и proffman
Значит, вообще никак не создать свой метод, чтоб потом его использовать несколько раз в сниппете? Только вставлять его тело много-много раз?
 
В using заходи и там на 2 вкладке пихай свой код.
 
В using заходи и там на 2 вкладке пихай свой код.
Пробовал писал.Из снипета не видится. Вероятнее всего с синтаксисом перемудрил, буду разбираться. Наверное, не так обращаюсь к нему. Пример бы где глянуть...


P.S. нашел косяк, теперь все норм:ay:
 
Последнее редактирование:
Пробовал писал.Из снипета не видится. Вероятнее всего с синтаксисом перемудрил, буду разбираться. Наверное, не так обращаюсь к нему. Пример бы где глянуть...
так если не видит, то указывай полностью с самого начала пространства имен "Zennolab"
 
так если не видит, то указывай полностью с самого начала пространства имен "Zennolab"
с обычными методами разобрался, где стандартные переменные типа int a и double b. Они вызываются - отрабатывают, проблем нет.А вот как там (во второй вкладке) писать методы, которые управляют инстансом. Если в них написать
Код:
Развернуть Свернуть Копировать
Tab tab = instance.MainTab;
tab.Navigate("zennolab.com");

пишет ошибку "имя instance отсутствует в данном контексте"

написал перед этим куском строчку
Код:
Развернуть Свернуть Копировать
Instance instance = new Instance("127.0.0.1", 40500, "server");

отрабатывает без ошибок, но ничего не происходит ) параметры может не те "127.0.0.1", 40500, "server"?
 
Так создавай объекты через полное имя, если instance не находит. Вроде через Zennolab.ZennoPoster доступно
 
Как вызвать кубик в C#?
 
C#:
Развернуть Свернуть Копировать
Random rnd = new Random();
int number = rnd.Next(0, 100);
if (number < 50) throw new Exception();
Кто подскажет как вставить переменную вместо числа 50?
 
C#:
Развернуть Свернуть Копировать
Random rnd = new Random();
int number = rnd.Next(0, 100);
if (number < 50) throw new Exception();
Кто подскажет как вставить переменную вместо числа 50?
C#:
Развернуть Свернуть Копировать
int a = Convert.ToInt32(project.Variables["name"].Value); //в переменной name значение 50. 
Random rnd = new Random();

int number = rnd.Next(0, 100);

if (number < a) throw new Exception();

Пишу с телефона, но вроде все ок.)
 
  • Спасибо
Реакции: xDESTROYx
Написал свой код для проекта, были ошибки из-за упоминания методов static public void main string, было решено сделать все в одном "теле метода". Теперь даже ошибку не пишет, лишь "Сбойное действие". Хотя бы другие кубы не трогает, но код так и не работает. В чем дело?


C#:
Развернуть Свернуть Копировать
int x = Convert.ToInt32(project.Variables["x"].Value) / 60 + 1;
            
    string key = "{END}";
    string repeatedKey = "";
            
    for (int i = 0; i < x; i++)
    {
        repeatedKey += key;
    }
            
return repeatedKey;
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)