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

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)
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
Интересная статья))
А как быть если мне нужно увеличить значение проектной переменной на 1?
Вот проектная переменная:
project.Variables["var"].Value;

Как мне в C# коде увеличить её на единицу? :-)
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
project.Variables["var"].Value = Convert.ToString(Convert.ToInt32(project.Variables["var"].Value)+1);
 
  • Спасибо
Реакции: KitKat21 и proffman

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
Супер)) :ay:
 

alexpost

Client
Регистрация
15.06.2016
Сообщения
173
Благодарностей
60
Баллы
28
Значит, вообще никак не создать свой метод, чтоб потом его использовать несколько раз в сниппете? Только вставлять его тело много-много раз?
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
В using заходи и там на 2 вкладке пихай свой код.
 

alexpost

Client
Регистрация
15.06.2016
Сообщения
173
Благодарностей
60
Баллы
28
В using заходи и там на 2 вкладке пихай свой код.
Пробовал писал.Из снипета не видится. Вероятнее всего с синтаксисом перемудрил, буду разбираться. Наверное, не так обращаюсь к нему. Пример бы где глянуть...


P.S. нашел косяк, теперь все норм:ay:
 
Последнее редактирование:

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Пробовал писал.Из снипета не видится. Вероятнее всего с синтаксисом перемудрил, буду разбираться. Наверное, не так обращаюсь к нему. Пример бы где глянуть...
так если не видит, то указывай полностью с самого начала пространства имен "Zennolab"
 

alexpost

Client
Регистрация
15.06.2016
Сообщения
173
Благодарностей
60
Баллы
28
так если не видит, то указывай полностью с самого начала пространства имен "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"?
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Так создавай объекты через полное имя, если instance не находит. Вроде через Zennolab.ZennoPoster доступно
 

Castaneda

Client
Регистрация
24.05.2019
Сообщения
872
Благодарностей
299
Баллы
63
Как вызвать кубик в C#?
 

xDESTROYx

Client
Регистрация
21.09.2019
Сообщения
149
Благодарностей
18
Баллы
18
C#:
Random rnd = new Random();
int number = rnd.Next(0, 100);
if (number < 50) throw new Exception();
Кто подскажет как вставить переменную вместо числа 50?
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
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

adr1enette

Client
Регистрация
30.11.2022
Сообщения
55
Благодарностей
14
Баллы
8
Написал свой код для проекта, были ошибки из-за упоминания методов 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)