Объект C # {int} не равен объекту {int} [duplicate]

    function logout(secUrl, redirUrl) {
        if (bowser.msie) {
            document.execCommand('ClearAuthenticationCache', 'false');
        } else if (bowser.gecko) {
            $.ajax({
                async: false,
                url: secUrl,
                type: 'GET',
                username: 'logout'
            });
        } else if (bowser.webkit) {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", secUrl, true);
            xmlhttp.setRequestHeader("Authorization", "Basic logout");
            xmlhttp.send();
        } else {
            alert("Logging out automatically is unsupported for " + bowser.name
                + "\nYou must close the browser to log out.");
        }
        setTimeout(function () {
            window.location.href = redirUrl;
        }, 200);
    }
I tried using the above in the following way. ?php ob_start(); session_start(); require_once 'dbconnect.php'; // if session is not set this will redirect to login page if( !isset($_SESSION['user']) ) { header("Location: index.php"); exit; } // select loggedin users detail $res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']); $userRow=mysql_fetch_array($res); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Welcome - <?php echo $userRow['userEmail']; ?></title> <link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" /> <link rel="stylesheet" href="style.css" type="text/css" /> <script src="assets/js/bowser.min.js"></script> <script> //function logout(secUrl, redirUrl) //bowser = require('bowser'); function logout(secUrl, redirUrl) { alert(redirUrl); if (bowser.msie) { document.execCommand('ClearAuthenticationCache', 'false'); } else if (bowser.gecko) { $.ajax({ async: false, url: secUrl, type: 'GET', username: 'logout' }); } else if (bowser.webkit) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", secUrl, true); xmlhttp.setRequestHeader("Authorization", "Basic logout"); xmlhttp.send(); } else { alert("Logging out automatically is unsupported for " + bowser.name + "\nYou must close the browser to log out."); } window.location.assign(redirUrl); /*setTimeout(function () { window.location.href = redirUrl; }, 200);*/ } function f1() { alert("f1 called"); //form validation that recalls the page showing with supplied inputs. } </script> </head> <body> <nav class="navbar navbar-default navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a> </div> <div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li> <li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li> <li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li> </ul> <ul class="nav navbar-nav navbar-right"> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> <span class="glyphicon glyphicon-user"></span>&nbsp;Hi' <?php echo $userRow['userEmail']; ?>&nbsp;<span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span>&nbsp;Sign Out</a></li> </ul> </li> </ul> </div><!--/.nav-collapse --> </div> </nav> <div id="wrapper"> <div class="container"> <div class="page-header"> <h3>Coding Cage - Programming Blog</h3> </div> <div class="row"> <div class="col-lg-12" id="div_logout"> <h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1> </div> </div> </div> </div> <script src="assets/jquery-1.11.3-jquery.min.js"></script> <script src="assets/js/bootstrap.min.js"></script> </body> </html> <?php ob_end_flush(); ?> But it only redirects you to new location. No logout.
31
задан Community 23 May 2017 в 12:00
поделиться

5 ответов

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

Это код должен соответствовать вашим заявленным критериям: Если value является типом (в штучной упаковке), то вызовите полиморфный метод Equals, в противном случае используйте == для проверки ссылочного равенства.

public void SetValue(TEnum property, object value)
{
    bool equal = ((value != null) && value.GetType().IsValueType)
                     ? value.Equals(_properties[property])
                     : (value == _properties[property]);

    if (!equal)
    {
        // Only come here when the new value is different.
    }
}

( ** И, да, я знаю, что Nullable<T> является ценностным типом со своими собственными специальными правилами, касающимися бокса и распаковки, но здесь это почти не имеет значения.)

15
ответ дан LukeH 19 August 2018 в 00:35
поделиться
  • 1
    Спасибо, это работает отлично и не имеет больших накладных расходов. Я не вижу увеличения средней продолжительности работы. – Steven Jeuris 2 June 2011 в 21:51
  • 2
    Накладные расходы в боксе также вызывает getType () имеет стоимость. Лучше всего избегать этого, генерируя делегат getter и setter на лету. Храните вещи в реальный тип, никогда не боксируя. – RJ Thompson 3 November 2017 в 18:01

Я полагаю

Я хотел бы сохранить простое сравнение ссылок, если значение не помещено в поле.

несколько эквивалентен

Если значение помечено в квадрат, я сделаю «простое сравнение ссылок».

Это означает, что первое, что вам нужно сделать, это проверьте, включено ли значение или нет.

Если существует метод проверки того, является ли объект типом вложенного типа или нет, он должен быть, по меньшей мере, таким же сложным, как этот метод «overkill», который вы предоставили если это не самый простой способ. Тем не менее, должен быть «самый простой способ» определить, является ли объект типом с коротким значением или нет. Маловероятно, что этот «самый простой способ» проще, чем просто использовать метод Equals (), но я задал этот вопрос, чтобы узнать на всякий случай.

(не уверен, был ли я логичен)

0
ответ дан blizpasta 19 August 2018 в 00:35
поделиться

Как насчет этого:

if(object.ReferenceEquals(first, second)) { return; }
if(first.Equals(second)) { return; }

// they must differ, right?

Обновить

Я понял, что это не работает как ожидалось для определенного случая:

  • Для (f2) возвращает false, поэтому мы возвращаемся к Equals, который ведет себя как ожидалось.
  • Для ссылочных типов, где ReferenceEquals возвращает true, мы считаем их «одинаковыми», как ожидалось.
  • Для ссылочных типов, где ReferenceEquals возвращает false и Equals возвращает false, мы считаем их «разными», как ожидалось.
  • Для ссылочных типов, где ReferenceEquals возвращает false и Equals возвращает true, мы считаем их «одинаковыми», хотя мы хотим «разные»

Итак, урок «не получается умным»

1
ответ дан default.kramer 19 August 2018 в 00:35
поделиться
  • 1
    если значение было просто в коробке, как в случае типов значений, первый if всегда будет давать false, поэтому он не решит проблему OP. – Simone 1 June 2011 в 18:34
  • 2
    Проблема, как я понимаю, «Я хотел бы сохранить простое сравнительное сравнение, если значение не помещено в коробку». Это сделало бы это. Но, как говорит Шон, «если кто-то переопределил .Equals () в классе, это потому, что они хотят изменить семантику равенства для этого типа, и лучше позволить, чтобы это произошло, если у вас нет веской причины не касаться & quot; ;. Я предположил, что у искателя есть веская причина. – default.kramer 1 June 2011 в 18:36
  • 3
    Это правильное предположение. ;п – Steven Jeuris 1 June 2011 в 19:05
  • 4
    Тем не менее, мне нужно будет проверить, правильно ли это в другое время, теперь нужно идти. Я считаю, что Симона делает правильный вывод. – Steven Jeuris 1 June 2011 в 19:11
  • 5

Равен (), как правило, является предпочтительным подходом.

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

10
ответ дан Sean U 19 August 2018 в 00:35
поделиться
  • 1
    Проблема в том, что Equals можно было бы переопределить. Хотя два объекта равны, это не означает, что новый объект (с другой ссылкой) не задан. – Steven Jeuris 1 June 2011 в 19:03

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

Я думаю, что ваш единственный шанс - изменить подпись метода и написать разные перегрузки.

1
ответ дан Simone 19 August 2018 в 00:35
поделиться