Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вопросы по С#


Автор: Сарт 1.5.2006, 12:47
Господа, обьясните мне,недалекому, что аткое конструктор-деструктор ,для чего он нужон и как им юзаться плиз. К Троелсону не отсылать=)

Добавлено @ 12:53 
В чем различие между статическим конструктором констурктором ,конструктором с параметрами и как использовать статический конструктор в качестве счетчика обьектов? 

Автор: Pitc 1.5.2006, 13:03
Конструктор по умолчанию выделяет память  и инициализирует объект, в C# конструктор присваевает данным значения по умолчанию, чаще всего 0.
В большинстве случаев класс снабжен и другими конструкторами принимающими праметры. Использование такого конструктора самы простой способ инициализировать  состояние объекта в момент его создния, установив нужные значения.

Назначение статических конструкторов- присваивать начальные значения статическим переменным. 

Автор: Сарт 1.5.2006, 13:09
Маленькая просьба---приводите примеры с кодом плииз=)
тока не очень сложные а на уровне-- вот тут мы передали конструктором параметры и т д=) 

Автор: Pitc 1.5.2006, 13:20
Использование статического конструктора:
Дапустим нуна чтоб статической переменной color всегда при создании присваевалось значение black. 
Код

public class NewClass
{
///.....
    private static string color;
    static NewClass()
    {
          color = "black";
     }
///.....
}



/////////////
public static int Main(string[] args)
{
     Console.WriteLine("Color is :{0}",NewClass.color);
}
  

Автор: Сарт 1.5.2006, 13:42
гм а почему нельзя то же самое через метод сделать??
примерно так:
Код

public class NewClass
{
///.....
   public static string color;
   color="black";
      
///.....
}

public static int Main(string[] args)
{
     Console.WriteLine("Color is :{0}",NewClass.color);
}




 

Автор: Pitc 1.5.2006, 13:50
Вообще я у тебя метода не вижу.. smile 
Цитата

public class NewClass    
{    
///.....    
   public static string color;    
   color="black";    
       
///.....    
}


Добавлено @ 13:54 
Если использовать метод ,то потом его надо будет вызвать перед использованием переменной color, а уже потом обращаться к переменной.  

Автор: Сарт 1.5.2006, 14:23
упс ступил

public class NewClass
{
///.....
public void Colour()
{
   public  string color;
   color="black";
Console.WriteLine("Цвет ремешка"+colour);
  }    
///.....
}

public static int Main(string[] args)
{
     NewClass c1= new NewClass();
     c1.Colour
}
 

Автор: Wanderer2019 1.5.2006, 16:15
деструктор - есть понятие обратное конструктору. т.е. освобождает память. Не знаю насколько он необходим в C#, но вот в C++ он использовался для освобождения памяти выделяемой под определенные поля объекта. т.к. деструктор по умолчанию этого не делал. Соответсвенно ты можешь и не описывать не конструкто ни деструктор, тогда шарп сам проинициализирует все поля для создаваемого объекта (значениями типа null или 0), однако здесь могу возникнуть проблемы в случае если в качестве полей у тебя выступают например массивы и т.п., тогда при обращении к полю объекта через какой либо метод компилятор ругнется что значение данной переменной неопредлено.
 

Автор: ivashkanet 1.5.2006, 19:42
Значит так. Все что написано сверху верно, но хочу вставить свои пять копеек.

Назначение конструкторов -- проводить начальную инициализацию объекта. Все равно какую.
Деструктора -- высвобождение ресурсов, которые не может высвободить сборщик мусора, после удаления объекта. Например закрытие открытых файлов.

Цитата(Сарт @  1.5.2006,  13:42 Найти цитируемый пост)
   public static string color;    
   color="black";

Так не пойдет,    color="black"; -- это инструкция (комманда) она не может быть написана вне метода. Выскочит ошибка этапа компилирования, но значение полю можно присвоить и по-другому:
Код

   public static string color = "black";

Где ее инициализировать -- вопрос вкуса smile , но в конструкторе можно сделать более сложную инициализацию. Например просканировать другие классы (например запущенные процессы) и на этом основании заполнить свои поля.
Другой пример: в конструкторе формы-по-умолчанию присутствует метод InitializeComponent(); , который расставляет контролы на форме, накиданные нами в дизайнере.
Код

 public Form1()
        {
            InitializeComponent();
        }


Цитата(Pitc @  1.5.2006,  13:03 Найти цитируемый пост)
Назначение статических конструкторов- присваивать начальные значения статическим переменным. 

Не только.
Статический конструктор вызываеться один раз, перед созданием самого первого экземпляра класса. Он нужен, например, для инициализации констант класса. Ведь они имееют тип того же класса, а экземпляров его еще нет smile Вот он и позволяет выкрутиться.
Класс описывающий рациональные числа и его статический конструктор:
Код

static Rational()
{
   Console.WriteLine("static constructor Rational");
   Zero = new Rational(0, 1);
   One = new Rational (1, 1);
}

Назначение конструктора с параметрами нужно для более удобного присвоения значений полям нового класса. А для класса Rational подругому и нельзя только:
Код

Rational RatNumber = new Rational(1,2);  // создаем новое число 1/2


Что еще осталось? А!
Как вести подсчет количества объектов:
Нужно статическое (общее на все классы) поле counter. И увеличивать его на 1 при каждом создании нового объекта:
Код

    class MyClass
    {
        static int counter = 0;
        public MyClass()
        {
            counter++;
        }

P.S. И еще конструктор без параметров свегда вызывается самым первым в конструкторе с параметром (могу ошибаться, но по-моему так оно и есть) 

Автор: Void 1.5.2006, 20:03
Цитата(ivashkanet @  1.5.2006,  21:42 Найти цитируемый пост)
Деструктора -- высвобождение ресурсов, которые не может высвободить сборщик мусора, после удаления объекта.

Во-первых, в C# деструкторов нет, а есть финализаторы, по недоразумению обладающие синтаксисом деструкторов.
Во-вторых, для высвобождения unmanaged ресурсов существует паттерн IDisposable и финализаторы писать обычно не рекомендуется.

Добавлено @ 20:06 
Цитата(ivashkanet @  1.5.2006,  21:42 Найти цитируемый пост)
И еще конструктор без параметров свегда вызывается самым первым в конструкторе с параметром

Если явно не указан — не вызывается. 

Автор: ivashkanet 1.5.2006, 21:38
Цитата(Void @  1.5.2006,  20:03 Найти цитируемый пост)
Во-первых, в C# деструкторов нет, а есть финализаторы

Знать ничего не знаю, вот что напиано в MSDN про destructors:
Цитата

Destructors are used to destruct instances of classes.
Remarks:
Destructors cannot be defined in structs. They are only used with classes.
A class can only have one destructor.
Destructors cannot be inherited or overloaded.
Destructors cannot be called. They are invoked automatically.
A destructor does not take modifiers or have parameters.

For example, the following is a declaration of a destructor for the class Ca
Код

class Car
{
    ~ Car()  // destructor
    {
        // cleanup statements...
    }
}

Цитата(Void @  1.5.2006,  20:03 Найти цитируемый пост)
 IDisposable

А что, если я открываю 1 несчастный файл мне для его корректного закрытия переписывать все методы IDisposable. И не подумаю smile 

Цитата(Void @  1.5.2006,  20:03 Найти цитируемый пост)
Если явно не указан — не вызывается. 

Да, не вызывается. 
А с чего я это взял ...  smile 

P.S. В двух словах о деструкторе -- это такой зверь который вызывается самым последним при уничтожении объекта.
 

Автор: Void 1.5.2006, 21:48
Цитата(ivashkanet @  1.5.2006,  23:38 Найти цитируемый пост)
А что, если я открываю 1 несчастный файл мне для его корректного закрытия переписывать все методы IDisposable. И не подумаю smile 

Зря.

Спорить не буду, почитай у Рихтера про завершение и http://gzip.rsdn.ru/article/dotnet/GCnet.xml статью. 

Автор: ivashkanet 1.5.2006, 22:01
Только что глянул Idisposable, в нем оказался всего 1 метод Dispose(). Наследовать его можно, не страшно.  smile 
Но вот когда он вызывается? 
Вручную -- не интересно smile 

Кстати. В MSDN в примере к статье про Idisposable метод Dispose() вызывается примо из деструктора smile 
Цитата

~MyResource()      
        {
            // Do not re-create Dispose clean-up code here.
            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.
            Dispose(false);
        }

Цитата

            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.

оптимален для читаемости и отладки smile  

Автор: Void 1.5.2006, 22:04
Цитата(ivashkanet @  2.5.2006,  00:01 Найти цитируемый пост)
Вручную -- не интересно

Полуавтоматически — с помощью using-блоков. 

Автор: ivashkanet 1.5.2006, 22:30
Цитата(Void @  1.5.2006,  21:48 Найти цитируемый пост)
Спорить не буду, почитай у Рихтера про завершение и вот эту статью. 

Спасибо за статью, заставляет задуматься. 

Автор: Сарт 3.5.2006, 20:19
Народ, разрешите прервать вашу столь увлекательную беседу, но у меня возник вопрос. КУДА писать деструктор при создании счетчика объектов? Ведь его.как подсказывает мне логика, нужно каким то образом не только увеличивать,но и уменьшать....Пример:Создан объект, создан 2-ой. Счетчик показывает 2. 1 объект удалили,но счетчик то все равно покажет 2=)) Помогите плиз,и куджа писать деструктор??...
Могу выложить код но он несколько..сумбуренЮ,что ли?? 

Автор: ivashkanet 3.5.2006, 20:42
Цитата(Сарт @  3.5.2006,  20:19 Найти цитируемый пост)
 КУДА писать деструктор при создании счетчика объектов?

Да, эт я ломанулся. А вопрос даже не КУДА, а КАК писать деструктор
Код

   class MyClass    
    {    
        static int counter = 0;    
        public MyClass()    
        {    
            counter++;    
        }
        ~MyClass()    
        {    
            counter--;    
        }
    }


 

Автор: Void 3.5.2006, 20:48
Цитата(Сарт @  3.5.2006,  22:19 Найти цитируемый пост)
Пример:Создан объект, создан 2-ой. Счетчик показывает 2. 1 объект удалили,но счетчик то все равно покажет 2=))

Проблема в том, что заранее неизвестно, когда сборщик мусора подберет объект. Время жизни объектов в .NET недетерминированно, так что не удивляйся, что счетчик будет сбрасываться с некоторым запозданием. 

Автор: Сарт 3.5.2006, 23:18
Создать деструктор класса, 
Цитата

определить момент его вызова 


Народ расшифруйте фразу 

Автор: mr.DUDA 4.5.2006, 12:15
Цитата(Сарт @  3.5.2006,  22:18 Найти цитируемый пост)
Народ расшифруйте фразу

Деструктор вызывается автоматически сборщиком мусора. Для тебя это означает: время ,когда деструктор будет вызван, неизвестно. Хоть через минуту, хоть через две. Притом, что ссылок на объект уже давно 0. 

Автор: Сарт 4.5.2006, 23:07
Сегодня пристал к преподу довел его этим вопросом....Итак внимание,правильный ответ!!!!!!!
фраза 
Цитата

определить момент его вызова 

Означает...что бы вы подумали?? А не что иное как код вида:
Код

~Clock()
Console.WriteLine("Деструктор вызван");


Я плакалЪ... 

Автор: ivashkanet 5.5.2006, 09:46
Цитата(Сарт @  4.5.2006,  23:07 Найти цитируемый пост)
~Clock()

В топку твоего препода smile 
Номер раз: Деструкторы одычно имеют private модификатор и поэтому вызвать его из кода вне класса невозможно.
Номер два: Деструктор не уничтожает объект (действительно слово для него неправильное выбрали, лучше уж финализатор), а только делает предварительные действия перед удалением объекта.
Номер три: если уж хочешь сам удалить объект нужно делать так: Убираешь все с него ссылки, и дважды smile  (ИХМО, бред, но так говорит статья предложенная выше) вызываешь сборщика мусора  и между вызовами ждешь пока он закончит финализацию smile 
Код

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
 

Автор: Сарт 5.5.2006, 13:47
Пасиб,чувствую сча прочитаю Троелсона страниц 20 и снова какой нить мелкий вопрос задам=)) 

Автор: Сарт 5.5.2006, 15:52
Вопрос возник УЖЕ=)
Итак вот код:
Код

using System;


namespace Lab01
{
    /// <summary>
    /// Обьявление класса Часы
    /// </summary>
    public class Clock
    {    
        /// <summary>
        /// Обьявление переменных типа string, содержащих информацию о дате изготовления,стране изготовления, марке часов, цвете стрелок, цвете фона, цвете цифр
        /// </summary>
        protected string God="2005";
        private string Country="Беларусь";
        public string Model="Z1527";
        private string ArrowColour="Черный";
        private string FoneColour="Белый";
        private string NumberColour="Желтый";
        public string day,mounth,year;
        public static int ObjCount;
        public int intX;
        /// <summary>
        /// Обьявление класса Info,содержащего информацию о дате изготовления часов,стране и модели.
        /// </summary>
        public void Info()
        {   ///
            /// Вывод информации на экран
            ///
            Console.WriteLine("Год выпуска "+God);
            Console.WriteLine("Страна-производитель "+Country);
            Console.WriteLine("Модель "+Model);
            
        }
        /// <summary>
        /// обьявление метода Дизайн
        /// </summary>
        public void Design()
        {///Вывод информации о цвете стрелок,фона и цифр
            Console.WriteLine("Цвет стрелки "+ArrowColour);
            Console.WriteLine("Цвет фона "+FoneColour);
            Console.WriteLine("Цвет цифр "+NumberColour);
        }
        /// <summary>
        /// Обьявление SetLong, в котором содержиться информация о батарее
        /// </summary>
        /// <param name="otherValue"></param>
        

        public void SetLong()
        {
            Console.WriteLine("Заряда батареи достаточно для работы в течении 5 дней");
        }
        /// <summary>
        /// Обьявление 
        /// </summary>
        public void  GravirovkaStekla()
        {
            ///Обьявление переменной типа string, служащей для хранению информации, считанной с экрана.
            string s;
            Console.WriteLine("По умолчанию гравировка отсутсвует,но вы можете добавить надпись ");
            Console.WriteLine("Введите текст гравировки ");
            s=Console.ReadLine();
            Console.WriteLine("Теперь на ваших часах гравировка-надпись: "+s );
        }
        public void ZariadBatarei()
        {    
            string s;
            Console.WriteLine("Какое количество дней батарея уже проработала?");
            s=Console.ReadLine();
            ///Метод высчитывания того,на сколько хватит батареи
            if (Convert.ToInt32(s)==0)
            {
                Console.WriteLine("Заряда батареи хватит еще на 5 дней");
            }
            if (Convert.ToInt32(s)<0)
            {
                Console.WriteLine("Введена неверная информация");
            }
            if (Convert.ToInt32(s)!=0 && Convert.ToInt32(s)>0)
            {
                int rezult;
                rezult=Math.Abs(5-Convert.ToInt32(s));
                Console.WriteLine("Заряда батареи хватит еще на : "+rezult );
            }
        }
        public void Data()
        {
            ///Установка даты.
            
            Console.WriteLine("Введите дату:");
            day=Console.ReadLine();
            Console.WriteLine("Введите месяц:");
            mounth=Console.ReadLine();
            Console.WriteLine("Введите год:");
            year=Console.ReadLine();
            if (Convert.ToInt32(day)<31 && Convert.ToInt32(day)>1 && Convert.ToInt32(mounth)<12 && Convert.ToInt32(mounth)>1 &&Convert.ToInt32(year)>=2006)
                {
                Console.WriteLine("Теперь дата установленна.");
                Console.WriteLine("Сейчас день номер: "+day);
                Console.WriteLine("Месяц номер: "+mounth);
                Console.WriteLine("И год под номером: "+year);
                    }
            else Console.WriteLine("Ошиблись вводом");
            
                
            }
        
        /// <summary>
        /// Обьявление статической переменной RemeshokColour отвечающей за цвет ремешка часов;
        /// </summary>
        public static string RemeshokColour;
        /// <summary>
        /// Обьявление статического конструктора
        /// </summary>
         static Clock()
        {
            RemeshokColour="black";
        }
        public Clock(int x)
        {
             intX=x;
        }
        public Clock ()
        {
           ObjCount++;
            Console.WriteLine("Количество созданных объектов: "+ObjCount);
         }
        ~Clock()
    
    {
            Console.WriteLine("Здесь используется деструктор");
                ObjCount--;
        }
        }

        }

    

        







А вопрос следующий,почему при выходе из проги(если надо могу выложить код с Маина, фраза 
Цитата

Здесь используется деструктор


выводиться 2!! раза?? 

Автор: ivashkanet 5.5.2006, 15:58
Сарт, очисти код от всего лишенего. Читать же невозможно.
А какой метод вызывает функция main smile  

Автор: Сарт 5.5.2006, 16:18
Гм а что там лишенго то?? комментарии??=)
а вот код с маином
Код

using System;

namespace Lab01
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        public static int Menu()
        {
            Console.WriteLine("1.Выход из программы");
            Console.WriteLine("2.Посмотреть дизайн часов");
            Console.WriteLine("3.Вывести Инфу");
            Console.WriteLine("4.Заряд батареи");
            Console.WriteLine("5.Сделать гравировку на часах");
            Console.WriteLine("6.Узнать,на сколько дней еще хватит батареи.");
            Console.WriteLine("7.Установить дату");
            Console.WriteLine("8.Посмотреть цвет ремня(using static constructor)");
            Console.WriteLine("9.Узнать гарантийный срок (using default constructor)");
            return Convert.ToInt32(Console.ReadLine());
        }
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Clock n2= new Clock();
            Clock n1 = new Clock(100);
            bool proverka;
            proverka=true;
            while(proverka)
            {
                int str=Menu();
                
                if (str<10 && str>0)
                {
                {
                    if (str==1) 
                    {
                        proverka=false;

                    }
            
                    if (str==2)
                    {
                        n2.Design();
                    }
                    if (str==3)
                    {
                       n2.Info();    
                    }
                    if (str==4)
                    {
                        n2.SetLong();
                    }
                    if (str==5)
                    {
                        n2.GravirovkaStekla();
                    }
                    if (str==6)
                    {
                        n2.ZariadBatarei();
                    }
                    if (str==7)
                    {
                        n2.Data();
                        
                    }
                    if (str==8)
                    {
                        Console.WriteLine("Цвет ремешка: "+Clock.RemeshokColour);

                    }
                    if (str==9)
                    {
                        Console.WriteLine("Гарантийный срок составляет:"+n1.intX);
                    }
                }
                         
                } 
                else
                {
                    Console.WriteLine("Выберите верный пункт меню");
                    str=Menu();
                }
            }
            
        }

    }
    
}


Но поскольку тут нету конструктора то думаю не из за этого=))
А,это лаба,поэтому лишенго нету=)) Или я не прав?? 

Автор: ivashkanet 5.5.2006, 16:21
Сарт,  smile . У меня в таком коде 
Код

    class Program
    {
        static void Main(string[] args)
        {
            Clock cl = new Clock();
        }
    }
    public class Clock
    {
        static int ObjCount = 0;

        public Clock()
        {
            ObjCount++;
        }
        ~Clock()
        {
            Console.WriteLine("Здесь используется деструктор");
            ObjCount--;
        }
    }

1 раз строка выкакивает, а если два объекта создам, то 2 раза  smile

Добавлено @ 16:26 
Цитата(Сарт @  5.5.2006,  16:18 Найти цитируемый пост)
            Clock n2= new Clock();    
            Clock n1 = new Clock(100);

Ты ж два объекта создаешь, вот он и вызывается по разу для каждого

P.S. Все лишнее, это код не относящийся к делу. Вот у меня код без всего лишнего

Добавлено @ 16:28 
Цитата(Сарт @  5.5.2006,  16:18 Найти цитируемый пост)
комментарии??=)

Комментарии никогда лишними не бывают smile  

Автор: Сарт 5.5.2006, 16:33
Ясненько,пасиб......сча дальше буду делать=) 

Автор: Сарт 6.5.2006, 20:30
 Ребята!! Расскажите про композицию и агрергацию, что это такое?? 
Знаю тока что там отличается типом доступа к чему-то там.... Расскажите, как и что там?? 

Автор: Сарт 7.5.2006, 11:33
Что?? Неужели никто не знает??
 

Автор: Pitc 7.5.2006, 11:46
Насколько я помню композиция это когда к классу закрытому для наследования обращются через объект этого класса... 

Автор: Сарт 7.5.2006, 12:32
Егор е-мое какое наследование во 2-ой лабе???? Во второй лабе у нас не то немного=)).
Давай рассказывай по человечески+разницу свойства-метода и что есть поле=) 

Автор: Pitc 7.5.2006, 14:15
Свойства используются для обращения к закрытым членам класса.

Код

public class Employee
{
private Int empID;
// Свойство для empID
public Int EmpID
{
get {return empID:}
set
{
// В основном проверка вводимых значений
empID - value;
} .
}


public static int Main(sthng[] args)
Employee p = new Employee();
// Устанавливаем значение
p.EmpID = 81;
// Получаем значение
Console.WriteLineC'Person ID Is: {0}". p.EmpID):
return 0;


Книгу почитай...!!! 

Автор: Сарт 7.5.2006, 15:09
Дай книгу=)в Троелсоне нету=)

Цитата

public Int EmpID

слово Int всмысле int?
а как насчет поля для енума??
кстати обьясни словами что есть поле а что есть свойство.... 

Автор: Сарт 8.5.2006, 22:52
Народ че никто не нает?? 

Автор: nikitao 8.5.2006, 23:42
Поле-это пременная-член класса,а свойство-это тоже поле,но для которого определены get или(и) set.

Добавлено @ 23:52 
Int32==int,а просто Int вроде нет.

Добавлено @ 23:56 
С enumaми также работать как и с обычными свойствами. smile  

Автор: Exception 9.5.2006, 00:25
Модератор: кхе-кхе.. Одна тема - один вопрос!
P.S. nikitao, приветствую на форуме дотнетчиков smile ! Будь тут как дома smile 

Автор: Pitc 9.5.2006, 02:07
nikitao, 
Цитата

Поле-это пременная-член класса,а свойство-это тоже поле,но для которого определены get или(и) set.


Свойство это метод , а не переменная, с помощью которого осуществляется доступ к закрытым переменным. smile 

Код

Int32==int,а просто Int вроде нет.


Я просто описался .  smile 


Exception, 
Цитата

Модератор: кхе-кхе.. Одна тема - один вопрос!


Если 
Сарт, будет для каждого вопроса создавать новую тему , то это будет выглядеть как спам форума. Пускай лучше здесь пишет.. Тем более у темы вроде название подходящие Вопросы по С#  smile  

Автор: Exception 9.5.2006, 02:35
Ну уж нет. Пусть выделит группы вопросов и задаёт. А с элементарными можно и самому разобраться. 

Автор: nikitao 9.5.2006, 12:07
Exception, пасибо.


Цитата(Pitc @  9.5.2006,  03:07 Найти цитируемый пост)
Свойство это метод , а не переменная, с помощью которого осуществляется доступ к закрытым переменным. 

Т е свойством мы называем сами get и set для поля smile 
 

Автор: Сарт 9.5.2006, 13:27
Уважаемый Exception представьте что вы читаете книгу,возник 1 вопрос--разъяснили,задали второй-опять таки....как тут мона в группы то организовать? Лучше сделать эту тему верху и обозвать типа новичкам=)) 

Автор: Pitc 9.5.2006, 14:34
nikitao, 
Цитата

Поле-это пременная-член класса


Термин поле используется для переменных объявленных с ключевым словом public.

Цитата

Т е свойством мы называем сами get и set для поля 


Свойство представляет объеденение данных и методов в одно целое. Внешнее обращение к свойству анологично обращению к полю. В общем случае свойство состоит из 2 скрытых методов.

 smile  

Автор: Exception 9.5.2006, 15:01
Просто эта тема со временем превратится в свалку.
А поле - это любая переменная уровня класса, независимо от области видимости. 

Автор: Сарт 9.5.2006, 16:36
Ну, будем надеяться что не превратиться,просто это мой как бы учебный курс=) Зато в след раз когда ктото захочет научиться ,он всегда сможет зайти сюда и наверняка у него будут те же вопросы.
 

Автор: Tito 12.5.2006, 01:40
Сарт, Внимательно почитай того же Троелсена...книга отличная с толковыми примерами....там ответы на все твои несложные вопросы smile  

Автор: Mymik 12.5.2006, 21:52
Народ... помогите чем сможете :о)

Код

class MethodView
{

    public string[] name;
    public string[] value;
    public int iCount;

    public MethodView(Type type)
    { 
//        Type type = typeof(args);
        PropertyInfo[] apropinfo = type.GetProperties();

        iCount = 0;

        foreach (PropertyInfo pi in apropinfo)
        {
            if (pi.CanRead && pi.GetGetMethod().IsStatic)
                iCount++;
        }

        name = new string[iCount];
        value = new string[iCount];

        iCount = 0;

        foreach (PropertyInfo pi in apropinfo)
        {
            if (pi.CanRead && pi.GetGetMethod().IsStatic)
            {
                name[iCount] = pi.Name;
                value[iCount] = pi.GetValue(type, null).ToString();
                iCount++;
            }
        }
        Array.Sort(name, value);
    }
}


собственно говоря в конструктор данного класса передается typeof от пространства имен :о)... 

Но хочется как-то сделать так, чтобы можно было спрашивать у пользователя пространство имен, в котором он хочет вытащить все методы и их значения. Тобишь передавать строчку... но вопрос, как тогда взять typeof от значения, которое храниться в строчке, да еще и преобразовать его как-то в указатель на пространство имен :о)  гы, сам не понял что сказал... 

Ваши варианты ;о)... ваши идеи :о)...
 

Автор: mr.DUDA 13.5.2006, 10:28
Цитата(Mymik @  12.5.2006,  20:52 Найти цитируемый пост)
 но вопрос, как тогда взять typeof от значения,

Type.GetType (строковое_имя_типа)

Цитата(Mymik @  12.5.2006,  20:52 Найти цитируемый пост)
да еще и преобразовать его как-то в указатель на пространство имен

Бери свой namespace и цепляй к нему имя типа. Сам по себе namespace (без типа) никакого смысла не имеет. 

Автор: Сарт 13.5.2006, 15:02
2Тито 
Книга хреново отсканена,примеры конечно хорошие...но...да ладно...
Тока вот в Троелсоне отличие метода от свойства(то что является базовым,как я считаю) на 151 странице...то есть книга не очень построена на мой взгляд=)....
Народ кто знает книгу Либерти может она получше?? 

Автор: Сарт 14.5.2006, 12:15
Народ снова вопрос есть!
Итак, есть статический метод,но не хочет обьявляться как void
+как с помощью return вернуть 2 значения??
Код как я выкрутился,но хочеться в 1 статическом методе все это сделать
Код

class Class1
        {
            
            private static string mounth, date;
             static string MounthOfMaking()
            {
                mounth ="Ноябрь";
                 return (mounth);
             }
..........................................
static void Main(string[] args)
            {if (str==11)
                        {
                            Console.WriteLine(Class1.MounthOfMaking() + Clock.DateofMaking());
                        }
                    }


и др класс
Код

public class Clock
    {    private static int date;
                          public static int DateofMaking()
        {
            date=12;
            return(date);
        } 
 

Автор: Сарт 14.5.2006, 12:45
Вариант сделать 1 переменную типа "12 November" не предлагать,неинтересно. 

Автор: mr.DUDA 14.5.2006, 13:54

M
mr.DUDA
Сарт,

1) вопрос совершенно не понятен
2) одна тема - один вопрос, пожалуйста !
 

Автор: Сарт 14.5.2006, 15:32
Дуда,вроде как говорили уже=)
Насчет вопроса--переформулирую. Хочу сделать в статическом методе 2 переменных-mounth и date. Потом из другого класса вызвать этот метод. Как это сделать?
 

Автор: VisualProgrammerNET 14.5.2006, 16:18
Мда...  smile 
Код

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(MyClass.GetTwoVars()[0] + " " + MyClass.GetTwoVars()[1]);
            Console.Read();
        }
    }

    class MyClass
    {
        public static string[] GetTwoVars()
        {
            string[] Array = { "Month", "Year" };
            return Array;
        }
    }
 

Автор: Сарт 14.5.2006, 17:30
Ну тут пользователь может ввести херню типа месяц Бормордин и день кавалин.
Хочется именно 2 переменных типа стринг.
А не массив=) 

Автор: ivashkanet 14.5.2006, 19:02
Цитата(Сарт @  14.5.2006,  17:30 Найти цитируемый пост)
Хочется именно 2 переменных типа стринг.

Сарт, функция возвращает только одно значение. Запомни.
В каждом конкретном случае выкручиваются по разному. 
Чем тебе метод VisualProgrammerNET-а не устраивает  smile 
Не хочешь массив, соединяй строка в одну и ставь посередине какой-нить  хитрый символ, типа перевода строки. 

Автор: Сарт 14.5.2006, 19:26
Гм есть у меня 1 вариант тока не наю как реализовать.....
Короче грубо говоря вывести в методе через 2 Console.WriteLine день и месяц, а потом как нить эти строки склеить и присвоить 1 переменной....и уже эту переменную возвращать..тока не знаю можно ли так сделать?? Может кто подскажет?? 

Автор: ivashkanet 14.5.2006, 19:38
Цитата(Сарт @  14.5.2006,  19:26 Найти цитируемый пост)
Короче грубо говоря вывести в методе через 2 Console.WriteLine день и месяц, а потом как нить эти строки склеить и присвоить 1 переменной....и уже эту переменную возвращать..тока не знаю можно ли так сделать?? Может кто подскажет

Сарт, вот скажи, зачем я тебе ответ писал, чтоб ты опять спросил smile 
Код

       public string MonthAndDay()
        {
            string month = "Апрель", day = "23";
            return month + "\n" + day;
        }

....
            string month, day, answer ;
            answer = MonthAndDay();
            month  = answer.Split('\n')[0];
            day = answer.Split('\n')[1];
 

Автор: Сарт 14.5.2006, 20:08
не ну ты мне писал словами,а у меня общение  с миром исколючительно через код происходит...двоичный=))) Пасиб за помощь...Интересно препод заценит или нет?=) 

Автор: ivashkanet 14.5.2006, 20:32
Цитата(Сарт @  14.5.2006,  20:08 Найти цитируемый пост)
Интересно препод заценит или нет?=) 

Препод очень даже заценит метод VisualProgrammerNET-а.
А мой, если чесно, это извращение, вызванное твоим нежеланием использовать массивы.

Добавлено @ 20:33 
Цитата(Сарт @  14.5.2006,  20:08 Найти цитируемый пост)
не ну ты мне писал словами,а у меня общение  с миром исколючительно через код происходит

Что ты за программер такой, что не можешб слова воплотить в код.
Я, например, именно такими словами и думаю, а потом перевожу их в код. ИМХО, большинство так делают. 

Автор: mr.DUDA 14.5.2006, 22:47
Сарт, либо выноси каждый вопрос в отдельную тему, либо закрываем это обсуждение. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)