powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов исключенния
25 сообщений из 31, страница 1 из 2
Вызов исключенния
    #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
Вызов исключенния
    #32420409
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант

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

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

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

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

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

кажется какой-то из этих ключей.
...
Рейтинг: 0 / 0
Вызов исключенния
    #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
Вызов исключенния
    #32420477
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОбработку можно сделать в Main, но это неэффективно, так как придёться такую обработку делать в любом коде когда будет создаваться обьект данного класса.
...
Рейтинг: 0 / 0
Вызов исключенния
    #32420511
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОбработку можно сделать в Main,
Хорошо, как вы это себе представляете?
...
Рейтинг: 0 / 0
Вызов исключенния
    #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
Вызов исключенния
    #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
Вызов исключенния
    #32420657
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл текст попытки в обход опубликовать, но я думаю и так понятно:
Код: plaintext
1.
2.
3.
4.
...........
   HelloWorld hw3 = new HelloWorld();
   Console.WriteLine( "Count of objects: {0 }",HelloWorld.getCounter);
...........
...
Рейтинг: 0 / 0
Вызов исключенния
    #32420663
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я к чему веду - дело в том, что подход со статическим членом класса-счётчиком обеспечивает контроль за созданием объектов во всех сборках приложения, в то время как простой контроль в методе Main его не обеспечит.

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

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


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

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


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

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

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

Устраивает, я просто увлёкся и не видел твоего варианта :)
Но моё решение кажется менее объёмное ;) Минусы найдёшь?
...
Рейтинг: 0 / 0
Вызов исключенния
    #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
Вызов исключенния
    #32420822
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧто мне помешает создать два экземпляра класса myGenerator?:
myGenerator mg1 = new myGenerator();
myGenerator mg2 = new myGenerator();

ну на самом деле это решается добавлением в класс myGenerator приватного конструктора, который здесь не приведен, я думаю это и так понятно, или в версии C#2.0 добавлением к объявлению класса модификатора static, там есть такое нововведение, чтобы не морочиться с приватными конструкторами ради запрещения создания экземпляра класса.
...
Рейтинг: 0 / 0
Вызов исключенния
    #32420831
Осел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hDrummer,
вопрос в offtpic
А код первого шарпа, если его "откомпилиить" в сборку компилятором второго, будет работать?
...
Рейтинг: 0 / 0
Вызов исключенния
    #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
Вызов исключенния
    #32420852
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОселА код первого шарпа, если его "откомпилиить" в сборку компилятором второго, будет работать?
что имеется ввиду 1.0 и 1.1 или 1.0/1.2?

2softbuilder

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

Код: plaintext
new AloneInTheDark();


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

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

Если это будет библиотека классов, то для пользователя можно сделать public только myGenerator, о классе AloneInTheDark он ничего знать не будет и не сможет его использовать.
...
Рейтинг: 0 / 0
Вызов исключенния
    #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
Вызов исключенния
    #32420938
Осел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hDrummer
"что имеется ввиду 1.0 и 1.1 или 1.0/1.2? "
Тогда по-другому. Код каких версий С# компилятора из следующего списка 1.0, 1.1,1.0/1.2 будет работать, будучи "откомпилированным" "компилятором" версии 2.0 (той, что с шаблонами) без внесения изменений в код?
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов исключенния
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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