Статические методы по сравнению с методами экземпляра в C#

Вы никогда не звоните setupTableViews(). Ваш код должен выглядеть следующим образом:

class NavigationViewController: UIViewController, SideMenuControllerDelegate {

override func viewDidLoad() {
        super.viewDidLoad()

        setupTableViews()
    }

func setupTableViews() {
menuTable.reloadData()
    }
}

extension NavigationViewController: UITableViewDataSource, UITableViewDelegate {

    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SideMenuTableItem", for: indexPath as IndexPath) as! SideMenuTableItem
        cell.setItemData(items[indexPath.row])
        return cell
    }

    public func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
}

Вы никогда не вызываете функцию и не вызываете viewDidLoad. Это должно помочь. Кроме того, где находится остальная часть кода контроллера представления (это все? Не должно быть!).

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

Надеюсь, это поможет!

6
задан Dan Lew 22 April 2009 в 15:33
поделиться

4 ответа

Под чем Вы подразумеваете, "не получают преимущества GC"? Методы не собраны "мусор" - экземпляры.

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

Статические методы являются болью для тестирования, хотя - например, если Вы проходите проверку подлинности в методе Foo() путем вызова некоторого статического метода, затем когда Вы тестируете Foo() Вы не можете сделать его просто назвать ложный аутентификатор (если сам статический метод не позволяет Вам сделать это). Если Вы приводите исходный пример того, что Вы тестируете ложную реализацию некоторого интерфейса, содержащего Authenticate() метод, однако, можно заставить его вести себя однако, Вы хотите.

Править: В этом случае это походит на то, в чем Вы действительно нуждаетесь, метод экземпляра для Вашего Point введите для вычисления расстояния между двумя точками ("эта" и другой) - или потенциально статический метод фабрики для Distance ввести.

13
ответ дан 8 December 2019 в 02:41
поделиться

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

В основном статические методы принадлежат типу, в то время как методы экземпляра принадлежат экземплярам типа.

14
ответ дан 8 December 2019 в 02:41
поделиться

Если, будучи быстрее Вы подразумеваете, что код в методе выполнен быстрее, то нет. Код в статическом методе так же быстр как код в не статическом методе.

Если Ваш говорят об издержках выполнения вызова к методу, это становится немного более сложным. Это характерно для языков как Java, что вызовы экземпляра имеют больше служебное. В C# дело обстоит не так однако, потому что методы экземпляра не являются виртуальными по умолчанию.

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

Что касается Сборки "мусора", это главным образом важно для полей, не методов. К статическим полям можно получить доступ отовсюду в коде, таким образом, сборщик "мусора" не может определить, будет ли ссылка использоваться снова, таким образом, это никогда не будет собираться.

5
ответ дан 8 December 2019 в 02:41
поделиться

На основе Вашего примера я записал бы статическую служебную функцию для нахождения расстояния между двумя точками:

public static class Geometry
{
    public static double GetDistanceBetween(Point a, Point b) { ... }
}

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

double distance = Geometry.GetDistanceBetween(personA.Position, personB.Position);

Это уже находится практически на английском языке - почему делают это более неясным? Если Вы делаете Расстояние методом, то можно записать:

personA.Distance(personB)

или:

personB.Distance(personA)

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

2
ответ дан 8 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: