C # Видимость частных членов

13
задан Aran Mulholland 19 January 2010 в 10:40
поделиться

10 ответов

Там простой способ обеспечить это:

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

Серьезно - вы написали студенту код.

9
ответ дан 1 December 2019 в 20:29
поделиться

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

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

5
ответ дан 1 December 2019 в 20:29
поделиться

ParseFile , как вы заметили, просто «спускает» все - ничего хорошего для инкрементного разбора, который вы хотите сделать! Итак, просто подайте файл в синтаксический анализатор немного за раз, убедившись, что условно уступите управление другим потокам, как вы идете - например,

while True:
  data = f.read(BUFSIZE)
  if not data:
    p.Parse('', True)
    break
  p.Parse(data, False)
  time.sleep(0.0)

вызов time.sleep (0.0) - это способ Питона сказать «уступить другим потокам, если они готовы и ждут»; метод Синтаксический анализ документирован здесь .

Второй пункт - это, забудьте о блокировках для этого использования! -- используйте вместо этого Queue.Queue , это внутренне многопоточный и почти неизменно лучший и простой способ координации нескольких потоков в Python. Просто создайте экземпляр Queue q , q.put (имя) в нем и включите блок рабочих потоков в q.get () , ожидая получения дополнительной работы - это ТАК просто!

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

-121--4196158-

Второй подход имеет некоторые преимущества, такие как

  • Он позволяет вызывающим абонентам управлять временем существования выделенных памяти
  • Он позволяет вызывающим абонентам повторно использовать выделенную память для различных вызовов, которые следуют одному и тому же образцу
  • Он позволяет вызывающим абонентам решать, какие буфер для обеспечения, например, стека или кучи.
-121--4379000-

Самый простой способ обеспечить это - программировать на интерфейс, например:

class Program
{
    static void Main(string[] args)
    {
        IStudent s1 = new Student();
        IStudent s2 = new Student();

        s1.ExamineStudentsMembers(s1);
    }
}

public interface IStudent
{
    void ExamineStudentsMembers(IStudent anotherStudent);
}

public class Student : IStudent
{
    private string _studentsPrivateMember;

    public Student()
    {
        _studentsPrivateMember = DateTime.Now.Ticks.ToString();
    }

    public void ExamineStudentsMembers(IStudent anotherStudent)
    {
        Console.WriteLine(anotherStudent._studentsPrivateMember);
    }
}

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

8
ответ дан 1 December 2019 в 20:29
поделиться

Если вы намереваетесь изучить информацию о данной студенческой информации, то я бы изменил метод статическим:

  public static void ExamineStudentsMembers(Student student)
  {
     Console.WriteLine(student._studentsPrivateMember);
  }

вы тогда использовали Student.ExaminestudustudentsMembers (S1) . Использование S1.ExaminestudentsMembers (S2) будет недействительным.

Если это не назначаемое цель, я бы переписал метод как:

  public void ExamineStudentsMembers()
  {
     Console.WriteLine(_studentsPrivateMember);
  }

вышеупомянутое, тогда будет использоваться письмом S1.ExaminestudentsMembers ()

0
ответ дан 1 December 2019 в 20:29
поделиться

Я думаю, что будет джава эквивалентна чему-то вроде следующего php

$my_numbers = range(0,100);
echo implode($my_numbers, ' ');

, что позволяет избежать рекурсии, циклов, управляющих операторов и т.д.

-121--1851138-

Эта ошибка возникает при попытке добавить поле или члена непосредственно в пространство имен. Учитывая, что он указывает на app.config, вполне вероятно, что VS находится в плохом состоянии. Попробуйте закрыть и снова открыть Visual Studio и проверить, устранена ли ошибка.

Неудача при попытке перестроить и отправить результаты из окна вывода сборки на ваш вопрос.

-121--1843418-
  • Private означает, что доступ к члену (field/method/etc.) возможен только из в коде родительского типа . Из CSharpOnline
  • Отображаются частные члены нескольких экземпляров, которые можно вызвать. Это удобно при реализации метода «copy constructor» или «clone» в типе, где аргумент является экземпляром того же типа. Если проектировщики сделали бы недоступными частные поля, то вам, возможно, придется создать набор методов получения только для клона/копии, чтобы получить их. ИМХО, мне больше нравится, чем путь. В пределах того же типа чтение состояния другого объекта не так плохо, как запись в него (что может быть соглашением DONT-кода для вас/вашей команды).
4
ответ дан 1 December 2019 в 20:29
поделиться

Я не уверен, что он должен работать в этом пути, но вы получаете доступ к this.value и this.name в одном и том же обратном вызове. Предполагается, что этот ссылается на event.currentTarget , который в данном случае является элементом SELECT.

В этом случае this.value будет неопределенным, но вместо этого можно попробовать использовать $ (this) .val (); .

Вы пытались утешить переменные?

-121--4067287-

Как указано выше, сеансы, файлы cookie и IP-адреса неэффективны - злоумышленник может манипулировать всеми.

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

например.

$valid=check_auth($_POST['USERNAME'],$_POST['PASSWD']);
$delay=get_delay($_POST['USERNAME'],$valid);

if (!$valid) {
   header("Location: login.php");
   exit;
}
...
function get_delay($username,$authenticated)
{
    $loginfile=SOME_BASE_DIR . md5($username);
    if (@filemtime($loginfile)<time()-8600) {
       // last login was never or over a day ago
       return 0;
    }
    $attempts=(integer)file_get_contents($loginfile);
    $delay=$attempts ? pow(2,$attempts) : 0;
    $next_value=$authenticated ? 0 : $attempts + 1;
    file_put_contents($loginfile, $next_value);
    sleep($delay); // NB this is done regardless if passwd valid
    // you might want to put in your own garbage collection here
 }

Обратите внимание на то, что эта процедура, как написано, утекает информацию о безопасности, т.е. кто-то, атакующий систему, может увидеть, когда пользователь войдет в систему (время ответа на попытку злоумышленников снизится до 0). Можно также настроить алгоритм так, чтобы задержка вычислялась на основе предыдущей задержки и метки времени в файле.

HTH

C.

-121--1018877-

Мне нравится вторая точка, вы можете смотреть, но не трогайте этих частных членов.

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

2
ответ дан 1 December 2019 в 20:29
поделиться

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

public void ExamineStudentsMembers(Student anotherStudent) {
    //this seems very wrong
    Console.WriteLine(anotherStudent._studentsPrivateMember);
}

, однако, не кажется таким нечетным для методов, которые требуют такой функциональности. Какие методы требуют доступа к личным данным брата? Методы сравнения (в частности, равны) и объекты в структуре данных (скажем, дерево или связанный список).

Методы сравнения часто сравнивают частные данные напрямую, а не только публичные данные.

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

Интересно отметить, что эти два случая менее распространены в повседневной программировании, чем когда эта языковая функция была впервые разработана. Вернувшись в 1990-х и начале 2000-х годов, в C ++ было бы гораздо более распространено для создания пользовательских структур данных и методов сравнения. Возможно, это хорошее время для пересмотра частных членов.

2
ответ дан 1 December 2019 в 20:29
поделиться

Нет, это необходимо, код метода не специфичен для экземпляра, оно зависит только для типа объекта. (виртуальные методы) или объявленный тип переменной (для не виртуальных методов). Нестатические поля, с другой стороны, являются специфическими к примеру ... вот где у вас есть изоляция уровня экземпляра.

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

0
ответ дан 1 December 2019 в 20:29
поделиться

Область объекта не никогда не подразумевает безопасность - когда-либо! Это роль ОС для обеспечения безопасности времени выполнения. Это ошибка для разработки системы, которая опирается на обстоятельную область на языке, чтобы ограничить доступ экземпляра объекта выполнения объекта. Если бы это было не так, то все не оооязычные языки, по определению, не защищены.

-1
ответ дан 1 December 2019 в 20:29
поделиться

Объект - это просто часть данных; Класс содержит функциональность. Метод участника - это просто приятный трюк, играющий компилятор; Это действительно больше похоже на статический метод с подразумеваемым аргументом (как методы расширения). С этим в виду, защита объектов друг от друга не имеет никакого смысла; Вы можете защищать только классы друг от друга. Так что естественно, что это работает таким образом.

1
ответ дан 1 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

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