Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов исключенния / 25 сообщений из 31, страница 1 из 2
25.02.2004, 10:54
    #32420403
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
Делаю вызов исключения. Вроде как всё нормально, в консоли получаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
F:\work\C#>HelloWorld.exe
My country is Russia
Count of objects:  1 

Unhandled Exception: System.ApplicationException: Only one instance!!!
   at HelloWorld..ctor()
   at HelloWorld.Main()


Но перед получением сообщения в консоли выскакивает еще виндовое окно с сообщением. Что нужно сделать, что-бы это окно не выскакивало?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
using System;

public class HelloWorld
{
 private static String myCountry =  "Russia" ;
 private static int Counter;

 public HelloWorld()
 {
  myCountry =  "Russia" ;
  if (Counter ==  1 )
  {
   throw new ApplicationException( "Only one instance!!!" );
  }

  Counter++;
 }

 public static int getCounter
 {
  get
  {
   return Counter;
  }
 }

 public String Country
 {
  get
  {
   return myCountry;
  }
 }

 public static void  Main()
 {
  Console.WriteLine( "My country is {0 }",myCountry);
  HelloWorld hw1 = new HelloWorld();
  Console.WriteLine( "Count of objects: {0 }",HelloWorld.getCounter);
  HelloWorld hw2 = new HelloWorld();
  Console.WriteLine( "Count of objects: {0 }",HelloWorld.getCounter);
 }
}

...
Рейтинг: 0 / 0
25.02.2004, 10:59
    #32420409
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
как вариант

Код: plaintext
1.
2.
3.
4.
try { throw new ApplicationException( "Only one instance!!!" );}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
...
Рейтинг: 0 / 0
25.02.2004, 11:02
    #32420414
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
выскакивает еще виндовое окно с сообщением
все верно - это реакция на не обработанное исключение, и здесь не важно - консольное ли у вас приложение, или винформс.
...
Рейтинг: 0 / 0
25.02.2004, 11:03
    #32420417
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
о, вот и h того же мнения.
...
Рейтинг: 0 / 0
25.02.2004, 11:09
    #32420428
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
2snake
угу

щас softbuilder@inbox.ru скажет, что обрабатывать исключения нельзя, потому что это цензура :)
шутка, шутка, шутка, последний раз :-)))
...
Рейтинг: 0 / 0
25.02.2004, 11:10
    #32420431
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
вообще-то это дело как-то ещё можно обойти, на уровне настроек.
...
Рейтинг: 0 / 0
25.02.2004, 11:12
    #32420437
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
to hDrummer:

Дело в том что если такую обработку делать в самом конструкторе, то тогда нет смысла вообще генерировать исключение, достаточно только вывести сообщение. И в том и другом случае новый обьект будет создан (еще один). А нужно иметь только один экземпляр обьекта.

Обработку можно сделать в Main, но это неэффективно, так как придёться такую обработку делать в любом коде когда будет создаваться обьект данного.
...
Рейтинг: 0 / 0
25.02.2004, 11:13
    #32420438
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
нет, блин, на уровне компиляции тоже можно вроде бы, но надо проверить:

/warn:<n> Set warning level (0-4)
/nowarn:<warning list> Disable specific warning messages

кажется какой-то из этих ключей.
...
Рейтинг: 0 / 0
25.02.2004, 11:27
    #32420463
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
авторА нужно иметь только один экземпляр обьекта.

Тут была реализация старого решения с мьютексами для этого дела, а мне кажется можно ещё так извратиться:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
	public static void  Main()
	{
		if (AloneInTheDark.MustBeOnlyOne< 1 )
		{
			AloneInTheDark alone = new AloneInTheDark();
		}
		else {Console.WriteLine( "I have to be alone!" );}
		if (AloneInTheDark.MustBeOnlyOne< 1 )
		{
			AloneInTheDark alone = new AloneInTheDark();
		}
		else {Console.WriteLine( "I have to be alone!" );}

	}

	public class AloneInTheDark 
	{
		private static int counter =  0 ;
		public static int MustBeOnlyOne 
		{
			get {return counter;}
		}
		public AloneInTheDark () 
		{
			counter++;
			Console.WriteLine( "I'm alone!" );
		}
	} 


Тогда вообще можно контролировать количество объектов в памяти по желанию.
...
Рейтинг: 0 / 0
25.02.2004, 11:37
    #32420477
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
авторОбработку можно сделать в Main, но это неэффективно, так как придёться такую обработку делать в любом коде когда будет создаваться обьект данного класса.
...
Рейтинг: 0 / 0
25.02.2004, 11:50
    #32420511
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
авторОбработку можно сделать в Main,
Хорошо, как вы это себе представляете?
...
Рейтинг: 0 / 0
25.02.2004, 12:16
    #32420585
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
Примерно так как это сделано у тебя:

авторpublic static void Main()
{
if (AloneInTheDark.MustBeOnlyOne<1)
{
AloneInTheDark alone = new AloneInTheDark();
}
else {Console.WriteLine("I have to be alone!");}


Или непосредственно обработку исключения при создании обьекта.

Но я еще раз повторяю - такую обработку придёться делать каждый раз когда будет создаваться обьект, а это неэффективно.

P.S.
Если избежать окна нельзя - тогда вопрос закрыт.
...
Рейтинг: 0 / 0
25.02.2004, 12:39
    #32420646
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
Если тебя интересует как избавиться от создания более чем одного экземпляра обьекта, то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
 /*
 Что-бы нельзя было создать обьект обычным способом - 
конструктор обьявляем как private. Но он виден внутри класса, поэтому
для создания обьекта создаём специальный public static метод GetObject.
Компилируем как csc /target:library HelloWorld.cs
*/ 

using System;

public class HelloWorld
{
 private static String myCountry =  "Russia" ;
 private static int Counter =  0 ;

 private HelloWorld()
 {
  Counter++;
 }

 public static HelloWorld GetObject
 {
   get
   {
    if (Counter ==  0 )
    {
     HelloWorld hw = new HelloWorld();
     return hw;
    }
    else
    {
     Console.WriteLine( "Only one instance!!!" );
     return null;
    }
   }
 }

 public static int getCounter
 {
  get
  {
   return Counter;
  }
 }

 public String Country
 {
  get
  {
   return myCountry;
  }
 }
}


Пример использования:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 /*
Создаём отдельный класс для тестирования 
Компилируем как csc /reference:HelloWorld.dll Test.cs
*/ 

using System;

public class Test
{
 public static void  Main()
 {
  HelloWorld hw1 = HelloWorld.GetObject;
  Console.WriteLine( "Count of objects: {0 }",HelloWorld.getCounter);
  HelloWorld hw2 = HelloWorld.GetObject;
  Console.WriteLine( "Count of objects: {0 }",HelloWorld.getCounter);
 }
}


Код: plaintext
1.
2.
3.
4.
F:\work\C#>Test.exe
Count of objects:  1 
Only one instance!!!
Count of objects:  1 


Попытки же создать обьект в обход предлагаемых правил - убиваются на корню, еще при компиляции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
F:\work\C#>csc /reference:HelloWorld.dll Test.cs
Microsoft (R) Visual C# .NET Compiler version  7 . 00 . 9466 
for Microsoft (R) .NET Framework version  1 . 0 . 3705 
Copyright (C) Microsoft Corporation  2001 . All rights reserved.

Test.cs( 17 , 21 ): error CS0122: 'HelloWorld.HelloWorld()' is inaccessible due to its 
protection level


Цель достигнута.

Но повторю еще раз, изначально меня интересовал другой вопрос.
...
Рейтинг: 0 / 0
25.02.2004, 12:41
    #32420657
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
Да, забыл текст попытки в обход опубликовать, но я думаю и так понятно:
Код: plaintext
1.
2.
3.
4.
...........
   HelloWorld hw3 = new HelloWorld();
   Console.WriteLine( "Count of objects: {0 }",HelloWorld.getCounter);
...........
...
Рейтинг: 0 / 0
25.02.2004, 12:45
    #32420663
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
Я к чему веду - дело в том, что подход со статическим членом класса-счётчиком обеспечивает контроль за созданием объектов во всех сборках приложения, в то время как простой контроль в методе Main его не обеспечит.

А чтобы придать классу возможность контроля за созданием своих экземпляров, нужно иметь функциональность, позволяющую конструктору отменять свой вызов, т.е. что типа return false, но такой возможности нет.
Или просто нужен какой-то другой подход, о котором я не имею представления.

Итого -
есть две крайности реализации на уровне класса - или вообще не
создавать экземпляров класса или создавать их неограниченное количество, всё остальное только с контролем извне.
...
Рейтинг: 0 / 0
25.02.2004, 13:15
    #32420733
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
авторА чтобы придать классу возможность контроля за созданием своих экземпляров, нужно иметь функциональность, позволяющую конструктору отменять свой вызов, т.е. что типа return false, но такой возможности нет.
Или просто нужен какой-то другой подход, о котором я не имею представления.


Я не понял, мой вариант тебя не устраивает?
...
Рейтинг: 0 / 0
25.02.2004, 13:24
    #32420756
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
ага решение есть вот такое -

Код: plaintext
1.
2.
3.
public class myGenerator 
{
	public static AloneInTheDark OneObject = new AloneInTheDark();
}


и пользуем например так -

авторConsole.WriteLine(myGenerator.OneObject.ToString());

и никаких повторных созданий. Да вообще никаких созданий пользователем класса :)
...
Рейтинг: 0 / 0
25.02.2004, 13:27
    #32420765
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
авторЯ не понял, мой вариант тебя не устраивает?

Устраивает, я просто увлёкся и не видел твоего варианта :)
Но моё решение кажется менее объёмное ;) Минусы найдёшь?
...
Рейтинг: 0 / 0
25.02.2004, 13:38
    #32420784
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
to hDrummer:

авторpublic class myGenerator
{
public static AloneInTheDark OneObject = new AloneInTheDark();
}



Ты не приводишь полного кода своих примеров, это не очень удобно.

Но из того что есть я вижу использование двух классов. И я не вижу причин невозможности создать по несколько экземпляров их обоих.


Что мне помешает создать два экземпляра класса myGenerator?:
myGenerator mg1 = new myGenerator();
myGenerator mg2 = new myGenerator();

И что мне помешает написать:
public class myGenerator
{
public static AloneInTheDark OneObject = new AloneInTheDark();
public static AloneInTheDark2 OneObject = new AloneInTheDark();

}

Если уж ты предлагаешь вариант, хотелось бы иметь весь код с результатами выполнения.
...
Рейтинг: 0 / 0
25.02.2004, 13:56
    #32420822
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
авторЧто мне помешает создать два экземпляра класса myGenerator?:
myGenerator mg1 = new myGenerator();
myGenerator mg2 = new myGenerator();

ну на самом деле это решается добавлением в класс myGenerator приватного конструктора, который здесь не приведен, я думаю это и так понятно, или в версии C#2.0 добавлением к объявлению класса модификатора static, там есть такое нововведение, чтобы не морочиться с приватными конструкторами ради запрещения создания экземпляра класса.
...
Рейтинг: 0 / 0
25.02.2004, 14:00
    #32420831
Осел
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
hDrummer,
вопрос в offtpic
А код первого шарпа, если его "откомпилиить" в сборку компилятором второго, будет работать?
...
Рейтинг: 0 / 0
25.02.2004, 14:01
    #32420833
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
using System;

public class One
{

	public static void  Main()
	{
		
                 Console.WriteLine(myGenerator.OneObject.ItsMe);
	}

	public class myGenerator 
	{
		public static AloneInTheDark OneObject = new AloneInTheDark();
		private myGenerator(){}
	}

	public class AloneInTheDark 
	{
		public string ItsMe =  "Here I am" ;
	}

}


вот код, а результат - вывод
Here I am.
...
Рейтинг: 0 / 0
25.02.2004, 14:08
    #32420852
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
ОселА код первого шарпа, если его "откомпилиить" в сборку компилятором второго, будет работать?
что имеется ввиду 1.0 и 1.1 или 1.0/1.2?

2softbuilder

я вот вижу в своём решении тот минус, что в классе myGenerator жестко забит конструктор

Код: plaintext
new AloneInTheDark();


это даже не минус, а особенность реализации. Больше контроля - меньше свободы. В твоём решении наоборот - меньше контроля и больше совбоды.

softbuilder И я не вижу причин невозможности создать по несколько экземпляров их обоих.

Если это будет библиотека классов, то для пользователя можно сделать public только myGenerator, о классе AloneInTheDark он ничего знать не будет и не сможет его использовать.
...
Рейтинг: 0 / 0
25.02.2004, 14:31
    #32420931
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
to hDrummer:

У меня такое ощущения, что мы с тобой на разных языках говорим. Еще раз уточни обьекты какого класса на твой взгляд в твоём примере нельзя создать более одного раза?
Вот твой код с моими комментариями.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
using System;

public class One
{

    public static void  Main()
    {

      Console.WriteLine(myGenerator.OneObject.ItsMe);
      // Два экз. класса  AloneInTheDark
      AloneInTheDark a1 = new AloneInTheDark();
      AloneInTheDark a2 = new AloneInTheDark();
      // Два экз. класса One
      One o1 = new One();
      One o2 = new One();
      // Здесь создать обьект класса myGenerator не получится создать вообще
      // так у него public конструктора
      myGenerator mg1 = new myGenerator();
    }

    public class myGenerator
    {
        public static AloneInTheDark OneObject = new AloneInTheDark();
        private myGenerator(){}
    }

    public class AloneInTheDark
    {
        public string ItsMe =  "Here I am" ;
    }

}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
F:\work\C#>csc One.cs
Microsoft (R) Visual C# .NET Compiler version  7 . 00 . 9466 
for Microsoft (R) .NET Framework version  1 . 0 . 3705 
Copyright (C) Microsoft Corporation  2001 . All rights reserved.

One.cs( 17 , 25 ): error CS0122: 'One.myGenerator.myGenerator()' is inaccessible due 
to its
        protection level
...
Рейтинг: 0 / 0
25.02.2004, 14:33
    #32420938
Осел
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов исключенния
hDrummer
"что имеется ввиду 1.0 и 1.1 или 1.0/1.2? "
Тогда по-другому. Код каких версий С# компилятора из следующего списка 1.0, 1.1,1.0/1.2 будет работать, будучи "откомпилированным" "компилятором" версии 2.0 (той, что с шаблонами) без внесения изменений в код?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов исключенния / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]