Нулевое значение для Point3d

Автор Тема: Нулевое значение для Point3d  (Прочитано 8997 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Нулевое значение для Point3d
« : 11-01-2017, 10:28:01 »
К примеру в VB Net
я могу присвоить структуре Point3d значение Nothing

Код - vb.net [Выбрать]
  1. Dim pnt3d As Point3d = Nothing

а в C# не допускается присвоить значение null;
Код - C# [Выбрать]
  1. Point3d pnt3d = null;

Мне к примеру нужна будет функция, 
которая должна вернуть Point3d
либо в случае неудачи расчета вернет не point3d а как в VB Nothing

Код - C# [Выбрать]
  1. point3d funct(...) {
  2.    try {
  3.      ...
  4.       return p3d;
  5.    }
  6.    catch {return ???;}
  7. }

или все же сделать функцию которая будет
возвращать код завершения в виде int?





Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Нулевое значение для Point3d
« Ответ #1 : 11-01-2017, 10:32:45 »

Отмечено как Решение Алексей (IdeaSoft) 11-01-2017, 10:49:28

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Нулевое значение для Point3d
« Ответ #2 : 11-01-2017, 10:33:45 »
Код - C# [Выбрать]
  1. private Nullable<Point3d> getPoint3D()
  2.         {
  3.             try
  4.             {
  5.                 return Point3d.Origin;
  6.             }
  7.             catch
  8.             {
  9.                 return null;
  10.             }
  11.         }

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Нулевое значение для Point3d
« Ответ #3 : 11-01-2017, 10:48:00 »
Nullable<Point3d>
Спасибо.
Так получилось.
Код - C# [Выбрать]
  1. Nullable<Point3d> pnt = getPoint3D();
  2. // И проверить завершение функции так.
  3. if (pnt.Value != null)  {
  4. }

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Нулевое значение для Point3d
« Ответ #4 : 11-01-2017, 14:46:44 »
а в C# не допускается присвоить значение null;
допускается
Код - C# [Выбрать]
  1. Gem.Point3d? p = new Autodesk.AutoCAD.Geometry.Point3d(0, 0, 0);
  2. p = null;


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Нулевое значение для Point3d
« Ответ #6 : 11-01-2017, 15:23:19 »
Код - C# [Выбрать]
  1. Nullable<Point3d> pnt = getPoint3D();
  2. // И проверить завершение функции так.
  3. if (pnt.Value != null)  {
  4. }
Проверка будет возвращать всегда либо true (если pnt != null), либо InvalidOperationException (если pnt == null). Почитали бы Вы лучше мануал по ссылке от Вильдара, там отличные примеры есть.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Нулевое значение для Point3d
« Ответ #7 : 11-01-2017, 16:09:12 »
Код - C# [Выбрать]
  1. private Nullable<Point3d> getPoint3D()
  2.         {
  3.             try
  4.             {
  5.                 return Point3d.Origin;
  6.             }
  7.             catch
  8.             {
  9.                 return null;
  10.             }
  11.         }
Александр, Вы уверены, что эта конструкция способна вернуть null? :)
Это
Код - C# [Выбрать]
  1. Gem.Point3d?
равнозначно этому
Код - C# [Выбрать]
  1. Nullable<Point3d>
Это так, но первый вариант гораздо компактнее и на практике именно он обычно используется.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Нулевое значение для Point3d
« Ответ #8 : 11-01-2017, 16:15:58 »
Александр, Вы уверены, что эта конструкция способна вернуть null?
Я показывал пример, чтобы автор вопроса понял суть использования. Мой пример всегда будет возвращать точку начала координат )) Как там будет делать автор - я не в курсе
Это так, но первый вариант гораздо компактнее и на практике именно он обычно используется.
Дык само собой разумеющееся )) И я так-же и пишу "компактнее", но в данном ответе написал так все по той же причине - для более полного понимания

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Нулевое значение для Point3d
« Ответ #9 : 11-01-2017, 16:32:44 »
Кстати, вместо Nullable часто гораздо удобнее использовать метод с выходным параметром:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Получение точки методом пользовательского ввода
  3. /// </summary>
  4. /// <param name="point">Выходной параметр - полученная точка</param>
  5. /// <returns>true - точка получена, false - точка не получена</returns>
  6. public static bool GetPoint3D(out Point3d point)
  7. {
  8.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;  
  9.     PromptPointResult ptRes = ed.GetPoint("\nSelect point: ");
  10.     point = ptRes.Value;
  11.     return ptRes.Status == PromptStatus.OK;              
  12. }
  13.  
Использование метода:
Код - C# [Выбрать]
  1. Point3d pt;
  2. // Если точку получили
  3. if (GetPoint3D(out pt))
  4. {
  5.     // Используем точку. Например, вычислим вектор:
  6.     Vector3d ptVect = pt - Point3d.Origin;        
  7. }
  8.  

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Нулевое значение для Point3d
« Ответ #10 : 22-01-2017, 19:35:35 »
Кстати, вместо Nullable часто гораздо удобнее использовать метод с выходным параметром
Ну насчет удобства это вопрос конечно субъективный, но ИХМО выходные параметры это аттавизм - nullable (или если брать функциональных подход, то опциональный) параметр - это гораздо более гибкий подход (например в отличие от примера выше его можно и передать любому "адресату" с отсутствующим значением) + опять-таки выходной параметр очень плохо дружит с параллельными вызывами, да и просто с нелинейными алгоритмами. В общем я бы не рекомендовал их использовать в принципе, я например, если таковые есть в "сторонних" api - почти всегда "заворачиваю" их в "опциональную" обертку.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Нулевое значение для Point3d
« Ответ #11 : 23-01-2017, 00:59:09 »
Да, действительно, субъективный. Лично мне гораздо больше по душе использование вспомогательных методов с out параметром и возвращаемым булевым значением. По мне, это более логичный подход, чем создавать Nullable обертку и выполнять лишние преобразования. Эти преобразования, к тому же, снижают производительность. Но это мелочи. Главное, что мне так больше нравится :)
Просто для сравнения, без комментариев:
Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Нулевое значение для Point3d
« Ответ #12 : 23-01-2017, 06:57:11 »
Ну если будет время набросайте еще этюд (можно и не выкладывать, а так для себя в уме) где мы запрашиваем у пользователя несколько точек чисел (либо по количеству, либо "пока вводит" - как больше нравится) и возвращаем коллекцию (опять-таки - любую - на Ваше усмотрение) с ними.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Нулевое значение для Point3d
« Ответ #13 : 23-01-2017, 15:39:59 »
Я же не призываю всегда и везде вместо Nullable использовать out параметры. Есть случаи, когда использование Nullable более разумно и удобно, чем другие способы.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Нулевое значение для Point3d
« Ответ #14 : 15-02-2017, 13:22:21 »
Не обязательно null использовать. Можно, например, использовать double.NaN:
Код - C# [Выбрать]
  1.   public static class Point3dExt
  2.   {
  3.     /// <summary>
  4.     /// Для возврата из функций признака что нет точки
  5.     /// </summary>
  6.     public static Point3d NanPoint = new Point3d(double.NaN, double.NaN, double.NaN);
  7.  
  8.     public static bool IsNan(this Point3d point)
  9.     {
  10.       return double.IsNaN(point.X) || double.IsNaN(point.Y) || double.IsNaN(point.Z);
  11.     }
  12. ...
и далее используем
Код - C# [Выбрать]
  1. Point3d cntr = Point3dExt.NanPoint;
  2. ....
  3. if (cntr.IsNan()) ....