Должен ли я использовать структуру или класс для представления координат широты и долготы?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Должен ли я использовать структуру или класс для представления координат широты и долготы?

Сообщение Anonymous »

Я работаю с API геокодирования, и мне нужно представить координаты возвращаемой точки в виде пары широты и долготы. Однако я не уверен, использовать ли для этого структуру или класс. Моя первоначальная мысль заключалась в использовании структуры, но, похоже, в C# они обычно не одобряются (например, Джон Скит упоминает в этом ответе, что «я почти никогда не определяю пользовательские структуры»). Производительность и использование памяти не являются критическими факторами в приложении.
На данный момент я придумал эти две реализации, основанные на простом интерфейсе:
Интерфейс

Код: Выделить всё

public interface ILatLng
{
double Lat { get; }
double Lng { get; }
}
Реализация класса LatLng

Код: Выделить всё

public class CLatLng : ILatLng
{
public double Lat { get; private set; }
public double Lng { get; private set; }

public CLatLng(double lat, double lng)
{
this.Lat = lat;
this.Lng = lng;
}

public override string ToString()
{
return String.Format("{0},{1}", this.Lat, this.Lng);
}

public override bool Equals(Object obj)
{
if (obj == null)
return false;

CLatLng latlng = obj as CLatLng;
if ((Object)latlng == null)
return false;

return (this.Lat == latlng.Lat) && (this.Lng == latlng.Lng);
}

public bool Equals(CLatLng latlng)
{
if ((object)latlng == null)
return false;

return (this.Lat == latlng.Lat) && (this.Lng == latlng.Lng);
}

public override int GetHashCode()
{
return (int)Math.Sqrt(Math.Pow(this.Lat, 2) * Math.Pow(this.Lng, 2));
}
}
Реализация структуры LatLng

Код: Выделить всё

public struct SLatLng : ILatLng
{
private double _lat;
private double _lng;

public double Lat
{
get { return _lat; }
set { _lat = value; }
}

public double Lng
{
get { return _lng; }
set { _lng = value; }
}

public SLatLng(double lat, double lng)
{
this._lat = lat;
this._lng = lng;
}

public override string ToString()
{
return String.Format("{0},{1}", this.Lat, this.Lng);
}
}
Выполняя несколько тестов, я пришел к следующим выводам:
  • Структура всегда имеет структуру без параметров. конструктор, что означает, что вы не можете принудительно создать его экземпляр с помощью конструктора, который ожидает два свойства (для lat и lng), как это можно сделать с классом.
  • Структура (будучи типом значения) никогда не может быть нулевой, поэтому всегда будет содержать значение. Но вы все равно можете делать подобные вещи, реализуя интерфейс:

    Код: Выделить всё

    ILatLng s = new SLatLng(); s = null;
Итак, имеет ли смысл для структуры использовать интерфейс в этом случае?
  • Если я использую структуру, нужно ли мне переопределить Equals, GetHashCode() и т. д.? Мои тесты показывают, что сравнения работают корректно и без этого (в отличие от классов). Так нужно ли это?
  • Я чувствую себя более «комфортно», используя классы, так лучше ли просто придерживаться их, поскольку я лучше знаю, как они себя ведут? Будут ли люди, использующие мой код, сбиты с толку семантикой типов значений, особенно при работе с интерфейсом?
  • В реализации CLatLng , кажется ли переопределение GetHashCode() приемлемым? Я «украл» это из этой статьи, поэтому не уверен!
Любая помощь или совет принимаю с благодарностью!

Подробнее здесь: https://stackoverflow.com/questions/615 ... coordinate
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»