Eavan Kim Ответов: 3

Кто-нибудь помнит, как вручную освобождать управляемые объекты C#?


Фреймворки до .Net 4.5 часто не могли делать dispose, потому что существовал только защищенный Dispose и не было public.

Я помню, что существовал метод удаления этих объектов путем ручного доступа к объектам в системе после прохождения двух шагов, чтобы их можно было удалить вручную.

Я не могу найти код, который использовал в прошлом, и он не выходит, даже когда я ищу его, поэтому я задаю вопрос.

Если вы помните, пожалуйста, дайте мне сообщение.

Что я уже пробовал:

Нашел его в Google более 5 часов назад.

Я использовал много ключевых слов.

Но я не могу его найти.

В последний раз я нашел его два года назад.

3 Ответов

Рейтинг:
1

Eavan Kim

Это можно увидеть, избавившись от tcpclient в .net framework 4.0.

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

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

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

OriginalGriff

Вы уверены? Справочный источник не показывает ничего необычного в TCPClient.Способ утилизации:

https://referencesource.microsoft.com/#system/net/System/Net/Sockets/TCPClient.cs

Eavan Kim

https://drive.google.com/file/d/1Zi_xmXcv0LoABFM6qYetA5T7WgrN7ViI/view?usp=sharing

эта вещь.
Вы можете увидеть CS0122.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0122

OriginalGriff

Вы не можете вызвать версию с параметром bool напрямую, так как она защищена, но вы можете вызвать непараметрическую версию, которая вызывает версию bool и передает true.

Однако вызвать параметризованную версию довольно просто: выведите класс из того, который вы хотите утилизировать, и напишите общедоступный MyDispose, который вызывает защищенную версию dispose. Затем используйте его вместо исходного класса.

Eavan Kim

Важно то, что вы не можете вызвать Dispose.
Далее, вы должны знать, как кто-то может удалить объект.
Мне нужны знания.
Системные функции доступны и безопасны.
Я использовал его
Больше ничего не могу найти.
Я знаю, что это правильная функция "disposal".
Но если вы использовали Idisposable, вы знаете, что вызываете object = null.
просто мне нужны внутренние функции GC.
не ГК.

honey the codewitch

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

Eavan Kim

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

honey the codewitch

Я повторю еще раз: если вам приходится полагаться на недокументированные функции для освобождения объекта, вы делаете это неправильно.

Как правильно просить, чтобы удаляемый объект распоряжаться сам интерфейс IDisposable.Располагать().

Не соглашайтесь сколько угодно, потому что это не меняет фактов на местах. Честно говоря, фреймворк не заботится о вашем несогласии.

Eavan Kim

Я уважаю твой выбор, но это твой выбор.

Dave Kreskowiak

Позвольте мне кратко изложить то, что говорят Хани и Грифф.

В коде Dispose не было никакой ошибки вплоть до .NET 1.0, так что никто понятия не имеет, о чем вы говорите.

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

Eavan Kim

Я не говорю, что нет никаких других побочных эффектов.

Один способ-это не единственный способ решить все проблемы.

И не потому, что я этого не знаю.

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

просто, что все.

пожалуйста, перестаньте говорить "используйте GC"

Мне нужны некоторые забавные факты, обнаруженные людьми, которые в прошлом не верили в GC.

Dave Kreskowiak

Ни я, ни кто-либо другой не сказал "используйте GC". Он полностью автоматический и самонастраивается.

Грифф спросил, не об этом ли ты говоришь.Собирать, что никто в здравом уме не предложил бы сделать.

Я говорю, что никто не знает, о какой проблеме ты говоришь!

Eavan Kim

Извините за недоразумение.
В следующий раз я прочитаю его в более подлинном состоянии.

Рейтинг:
0

Sander Rossel

Кажется, я понимаю, что ты имеешь в виду...
Я столкнулся с некоторыми классами с частным/защищенным методом Dispose, но это действительно реализовало IDisposable, как и упомянутый вами TcpClient.
В этих случаях у вас есть два варианта: приведение к IDisposable и вызов Dispose или, часто предполагаемый метод, вызов альтернативного метода, обычно Close, вместо этого.
Это, вероятно, по замыслу, а не ошибка.
Вероятно, потому, что "закрыть" связь имеет больше смысла, чем избавиться от нее.
Я вижу, что поскольку объект TcpClient идет, распорядиться работает .4.7.2 чистый, но не 4 и 4,5 (и, наверное, все старые версии).

Другой метод правильного размещения этих объектов-это упаковка их в блок using, который все еще работает.

var client = new TcpClient();
client.Dispose(); // Error in .NET 4.5 and ealier
client.Close(); // This works and calls Dispose() internally

using (var client2 = new TcpClient())
{
    // Use client2 here, it is automatically disposed when it goes out of scope.
    // Works even in .NET 4.5 and earlier.
}


Рейтинг:
0

Gerry Schmitz

TcpClient (то есть "сокеты") возник примерно в 1983 году. В то время не было ни .NET, ни IDisposable.

Вы использовали Close() тогда, и вы используете Close() сейчас, чтобы закрыть соединения и освободить ресурсы.

TCP-соединения обычно являются "долгосрочными" (минуты, часы и дни). Вы поддерживаете долгосрочную коллекцию или ссылку. Случаи, когда вы действительно можете использовать шаблон "dispose / using" в "реальной ситуации", ничтожны.

Раскрывающий.Dispose() в основном избыточен при наличии функции .Close().