Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Читаю уроки. Не могу понять про static member, и instance member. 
V
    Опции темы
Gunslinger
Дата 17.6.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Много непонятных слов:
"
Вы можете определить член класса как статический (static member) или член экземпляра (instance member). По умолчанию каждый член определен как член экземпляра. Это значит, что для каждого экземпляра класса делается своя копия этого члена. Когда член объявлен как статический, имеется лишь одна его копия. Статический член создается при загрузке содержащего класс приложения и существует в течение жизни приложения. Поэтому вы можете обращаться к члену, даже если экземпляр класса еще не создан. 
Один из примеров — метод Main. CLR (Common Language Runtime) нужна универсальная точка входа в ваше приложение. Поскольку CLR не должна создавать экземпляры ваших объектов, существуют правила, требующие определить в одном из ваших классов статический метод Main.
Вы можете захотеть использовать статические члены при наличии метода, который формально принадлежит классу, но не требует реального объекта. Скажем, если вам нужно отслеживать число экземпляров данного объекта, которое создается во время жизни приложения. Поскольку статические члены «живут» на протяжении существования всех экземпляров объекта, должен работать такой код: ...."

Я расшифровал так. Экземпляр - это уже созданный в оперативе класс с переменными-методами. Если один и тот же класс в оперативе создан несколько раз, то у каждого своя переменная (instance), напр. int k. Если переменная класса с модификатором static, то сколько ни создава копий одного класса, int k будет всегда одна. Тогда "Поэтому вы можете обращаться к члену, даже если экземпляр класса еще не создан." еще более менее понятно. Дальше вообще понять не могу: 
Код
Вы можете захотеть использовать статические члены при наличии метода, который формально принадлежит классу, но не требует реального объекта. 

 

Это сообщение отредактировал(а) Gunslinger - 17.6.2009, 15:45
PM MAIL   Вверх
diadiavova
Дата 17.6.2009, 16:07 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Gunslinger @  17.6.2009,  15:41 Найти цитируемый пост)
Вы можете захотеть использовать статические члены при наличии метода, который формально принадлежит классу, но не требует реального объекта. 

Ну взять например класс Math, в нём определены статические математические функции
надо вычислить синус делаем так
Код

var sinx = Math.Sin(x);


Если бы метод не был статическим, то пришлось бы создавать экземпляр
Код

Math m = new Math();
var sinx = m.Sin(x);

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

Это сообщение отредактировал(а) diadiavova - 17.6.2009, 16:08


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Heinzz
Дата 17.6.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Вы правильно понимаете, а на счет статического метода вот Вам пример.

Синус угла, возведение в степень, 
Код

Math.Sin(x);
            Math.Pow(x,2);

или Вы просто решили насоздавать своих функций пользоваться которыми можно везде не создавая никаких объектов (ну типа как в функциональном програмировании).


--------------------
user posted image
PM MAIL   Вверх
Gunslinger
Дата 17.6.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(Heinzz @  17.6.2009,  16:12 Найти цитируемый пост)
Вы правильно понимаете, а на счет статического метода вот Вам пример.
............
или Вы просто решили насоздавать своих функций пользоваться которыми можно везде не создавая никаких объектов (ну типа как в функциональном програмировании). 


Т.е. раскручивая код diadiavova, метод Sin() в Math описан как static. Поэтому в коде достаточно подключить библиотеку Math.h (прошу прощения за мой английскийsmile) и можно писать, как приведено выше. Действительно, когда в колледже учили паскалю - так и писал. Поэтому не задумывался над этим. Оказывается, все хитрее. 

А если метод статический, а использует в своих вычислениях переменную класса, которая instance (по умолчанию, как я понял)?
PM MAIL   Вверх
DVariuS
Дата 17.6.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 5
Всего: 8



Цитата(Gunslinger @  17.6.2009,  16:28 Найти цитируемый пост)
А если метод статический, а использует в своих вычислениях переменную класса, которая instance (по умолчанию, как я понял)? 

Статические методы не имеют доступа к нестатическим полям класса.
PM MAIL   Вверх
Heinzz
Дата 17.6.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Цитата(DVariuS @  17.6.2009,  16:29 Найти цитируемый пост)
Статические методы не имеют доступа к нестатическим полям класса. 

Статический метод может использовать любые поля любого объекта, если этот объект является входящим параметром.

Я использую статический метод для того чтоб в текстбоксах можно было написать только числа:

Код

 //Класс для проверки введенного в текстбоксы текста
    /*-------------------------------------------------
       private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            TextValidator.OnlyDigits(sender, e);
        }
    -------------------------------------------------*/
    class TextValidator
    {
        public static void OnlyDigits(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '.') { e.KeyChar = ','; }//заменяет точки запятыми
            bool DenyCharacter = !System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0-9, '.']");
            bool ToManyCommas = (e.KeyChar == ',') & ((TextBox)sender).Text.Contains(',');
            e.Handled = DenyCharacter || ToManyCommas;
        }
    }



--------------------
user posted image
PM MAIL   Вверх
KelTron
Дата 18.6.2009, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Цитата(Heinzz @  17.6.2009,  16:39 Найти цитируемый пост)
Статический метод может использовать любые поля любого объекта, если этот объект является входящим параметром.


Вообще то разговор идёт о полях класса, в котором определён данный метод и DVariuS сказал
совершенно правильно.

Ты же говоришь о параметрах метода, что относится к любым методам, а не только к статическим, причём твой метод использует не
поля, а интерфейс объекта, что в данном случае - свойства.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
diadiavova
Дата 18.6.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Ну вообще-то  Heinzz тоже прав, поскольку он говорит о членах объекта, а не класса, а объектом всё-таки является экземпляр класса, а не сам класс. Если же говорить о доступе к нестатическим членам класса, то такого доступа вообще никто не имеет, поскольку их по сути дела не существует. Статические члены тем и тотличаются от нестатических, что первые принадежат классу, а вторые - экземпляру класса. 
А вот если мы говорим о правах доступа, то статические члены классса имеют такие же права, как и остальные. То есть, вот такой код
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            Console.WriteLine(A.ShowInf(a));
            Console.ReadKey();
        }
    }

    public class A
    {
        private string inf = "secret";
        public static string ShowInf(A ins)
        {
            return ins.inf;
        }
    }
}



Выведет на консоль значение поля inf экземпляра класса A не смотря на то, что это поле объявлено с модификатором private.
Поэтому не надо путать права доступа с попыткой достучаться к несуществующим сущностям(таким ка нестатические члены класса).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
KelTron
Дата 18.6.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



diadiavova, всё так, но речь шла немного о другом.
Проясню ситуацию чтобы не было путаницы.

Сначала речь шла об этом, и вот так делать нельзя:
Код

class SomeClass
{
    private int someField;

    public static void SomeMethod()
    {
        someField = 42;
    }
}


А ты же говоришь об этом, и вот так делать можно:
Код

class SomeClass
{
    private int someField;

    public static void SomeMethod()
    {
        SomeClass someInstance = new SomeClass();
        someInstance.someField = 42;
    }
}






Это сообщение отредактировал(а) KelTron - 18.6.2009, 09:19


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
diadiavova
Дата 18.6.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Ну это понятно. Только тут дело не в доступе, а в том, что поля someField не существует в классе. А создаётся оно вместе с экземпляром. А DVariuS писал о ДОСТУПЕ к нестатическим полям класса. Но у класса нет нестатических полей, потому и доступа к ним не может быть. Об этом я и написал. А если речь именно о доступе, то статические члены здесь имеют такие же права как и все остальные.

Это сообщение отредактировал(а) diadiavova - 18.6.2009, 09:24


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
KelTron
Дата 18.6.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Это ты уже придираешься к словам.
Как будто тебе было не понятно, что имелось ввиду)



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
diadiavova
Дата 18.6.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



KelTron, мне понятно. Только не я один это читаю. Я не придираюсь к словам, а всего лишь уточняю формулировку.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Heinzz
Дата 18.6.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Цитата(KelTron @  18.6.2009,  09:18 Найти цитируемый пост)
diadiavova, всё так, но речь шла немного о другом.
Проясню ситуацию чтобы не было путаницы.

Сначала речь шла об этом, и вот так делать нельзя:
Код

class SomeClass
{
    private int someField;
    public static void SomeMethod()
    {
        someField = 42;
    }
}




Код

class SomeClass
{
    private int someField;
    public static void SomeMethod(SomeClass sCs)
    {
        sCs.someField = 42;
    }
}

Вот что я имел в виду 


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.