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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по функциям 
:(
    Опции темы
motorway
Дата 1.9.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Допустим, есть класс Class1, и в нем поле field1, и есть функция

Код

private void Func (Class1 ob)
{
ob.field1=somevalue;
}


Вот вопрос. Когда функции передается параметр фактический, например someobj, то это значение подставляется в функцию, и полю этого объекта присваивается значение. Но почему присваивается именно реальному объекту, ведь вроде ob существует внутри функции, это внутренняя переменная?

PM MAIL   Вверх
taiven
Дата 1.9.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



С объектами тут всё немного не так, как с переменными
Вот, кажется так:
Код

private void Func (Class1 ob)
{
 Class1 temp = new Class1();
 ob = temp;
 ob.field1=somevalue;
}



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

Это сообщение отредактировал(а) taiven - 1.9.2008, 21:31
PM   Вверх
1stain
Дата 1.9.2008, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



taiven, что по-твоему выведется на консоль?
Код

    public class Program
    {
        public static void Main()
        {
            Class1 c1 = new Class1 { field1 = 12345 };
            Console.WriteLine("Class1.field1 before Foo calling: {0}", c1.field1);
            Func(c1);
            Console.WriteLine("Class1.field1 after Foo calling: {0}", c1.field1);
        }

        static public void Func(Class1 c1)
        {
            Class1 tempClass1 = new Class1();
            c1 = tempClass1;
            c1.field1 = 54321;
        }
    }

    public class Class1
    {
        public int field1;
    }


motorway, прочитай про передачу параметров по ссылке и по значению: прочитай меня


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
taiven
Дата 1.9.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

taiven, что по-твоему выведется на консоль?


И, что ты этим хочешь сказать? На консоль выведется 12345 и 12345.
а если убрать вот это:
Код

Class1 tempClass1 = new Class1();
c1 = tempClass1;

из функции Func, то на консоль выведется 12345 и 54321, что и требовалось доказать.
 

Это сообщение отредактировал(а) taiven - 1.9.2008, 23:03
PM   Вверх
EgoBrain
Дата 3.9.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 2



Может немного не в тему, но имхо правильнее делать так:
Код

using System.Windows.Forms;
using System.Drawing;

public class SomeProgram : Form
{
       public static void Main()
       {
          using (SomeProgram form1 = new SomeProgram())
         {
              form1.Show();
              Application.Run(form1);
          }
       }

       public SomeProgram()
       {
             this.Text = "SomeProgram";
             Func(this);
       }
 
       public static void Func(object sender)
       {
             SomeProgram prog = (SomeProgram)sender;
             MessageBox.Show(prog.Text);
       }

}


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

Это сообщение отредактировал(а) EgoBrain - 3.9.2008, 13:45
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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